2009-12-11 9 views
12

एक पायथन प्रोग्राम जो मैं लिख रहा हूं वह फ़ाइल के शीर्ष से लाइनों की एक निश्चित संख्या को पढ़ना है, और कार्यक्रम को भविष्य में उपयोग के लिए इस हेडर को संरक्षित करने की आवश्यकता है।पाश नियंत्रण चर के लिए अनदेखा करने के लिए पाइथोनिक तरीका

header = '' 
header_len = 4 
for i in range(1, header_len): 
    header += file_handle.readline() 

Pylint शिकायत है कि मैं चर i का उपयोग नहीं: वर्तमान में, मैं निम्नलिखित करने के लिए कुछ इसी तरह कर रहा हूँ। ऐसा करने के लिए एक और पाइथोनिक तरीका क्या होगा?

संपादित करें: कार्यक्रम का उद्देश्य बुद्धिमानी से मूल फ़ाइल को छोटी फ़ाइलों में विभाजित करना है, जिनमें से प्रत्येक में मूल शीर्षलेख और डेटा का सबसेट शामिल है। इसलिए, मुझे बाकी फ़ाइल पढ़ने से पहले ही शीर्षलेख को पढ़ने और संरक्षित करने की आवश्यकता है।

उत्तर

11
f = open('fname') 
header = [next(f) for _ in range(header_len)] 

जब से तुम हैडर वापस नई फ़ाइलें लिखने के लिए जा रहे हैं, आप इसके साथ कुछ करने की ज़रूरत नहीं है। नई फ़ाइल में इसे वापस लिखने के लिए:

open('new', 'w').writelines(header + list_of_lines) 

अगर आप पुरानी फाइल में लाइनों की संख्या पता है, list_of_lines बन जाएगा: का उपयोग कर के रूप में _ एक डमी चर है साथ

list_of_lines = [next(f) for _ in range(chunk_len)] 
+3

सीधे आगे, आसानी से समझने योग्य, और पिलिंट शिकायत को समाप्त करता है। इस प्रकार यह सबसे अच्छा जवाब है, आईएमओ। – GreenMatt

+0

क्या आप नई फाइल को बंद नहीं करना चाहते हैं? ;) – ThiefMaster

1

इस हो सकता है:

header_len = 4 
header = open("file.txt").readlines()[:header_len] 

लेकिन, यह लंबे समय से फ़ाइलों के लिए परेशानी हो जाएगा।

+5

.readlines(), पूरी फ़ाइल पढ़ता है, हालांकि .. यदि आप एक बड़ी फ़ाइल है और स्मृति में पूरी बात को पढ़ने के लिए नहीं करना चाहते, यह एक बुरा विचार हो सकता है –

+0

हाँ, मैंने यह जोड़ा है कि जब आप इसे लिख रहे थे,; – mshsayem

+1

अगर केवल रीडलाइन() आलसी थे! –

11

मुझे यकीन नहीं है कि पिलिंट नियम क्या हैं, लेकिन आप '_' फेंकने वाले चर नाम का उपयोग कर सकते हैं।

header = '' 
header_len = 4 
for _ in range(1, header_len): 
    header += file_handle.readline() 
+0

आपको लूप के लिए उपयोग करने की आवश्यकता नहीं है। मैं एक सूची समझ की सिफारिश करता हूं (नीचे मेरी पोस्ट देखें)। हालांकि, फेंकने चर पर अच्छा कॉल। – Escualo

+0

@ रोगर पाट: क्या आप समझा सकते हैं? – Escualo

+0

@ एरियाटा लूप के लिए क्या गलत है? –

10
import itertools 

header_lines = list(itertools.islice(file_handle, header_len)) 
# or 
header = "".join(itertools.islice(file_handle, header_len)) 

ध्यान दें कि पहले के साथ, न्यू लाइन वर्ण अभी भी मौजूद रहेंगे, उन्हें पट्टी:

header_lines = list(n.rstrip("\n") 
        for n in itertools.islice(file_handle, header_len)) 
+0

यदि आप लाइनों को पट्टी करते हैं तो मूल शीर्षलेख की संरचना को याद करना मुश्किल होगा। मैं आपको सलाह देता हूं कि आप उन्हें रखें। – Escualo

+0

नहीं, यह नहीं होगा। उस उदाहरण में वे एक लंबी स्ट्रिंग के बजाय एक सूची में संग्रहीत हैं। जिसे वह उपयोग करना चाहिए उस पर निर्भर करता है कि वह बाद में डेटा के साथ क्या कर रहा है। –

+0

ओपी अपनी लिपि 'हेडर + = ...' में लिखता है, इसलिए मुझे लगता है कि उसका मतलब एक स्ट्रिंग था, लेकिन आप सही हैं: यह निर्भर करता है। – Escualo

4

मेरे सर्वश्रेष्ठ उत्तर इस प्रकार है:

फ़ाइल test.dat :

This is line 1 
This is line 2 
This is line 3 
This is line 4 
This is line 5 
This is line 6 
This is line 7 
This is line 8 
This is line 9 

पायथन लेखक pt:

f = open('test.dat') 
nlines = 4 
header = "".join(f.readline() for _ in range(nlines)) 

आउटपुट:

>>> header 
'This is line 1\nThis is line 2\nThis is line 3\nThis is line 4\n' 

सूचना है कि आप किसी भी मॉड्यूल कॉल करने के लिए जरूरत नहीं है, यह भी कि आप _ के स्थान पर किसी भी डमी वैरिएबल का उपयोग कर सकते हैं (यह i, या j, या ni, या जो भी हो) के साथ काम करता है लेकिन मैं आपको सलाह देता हूं कि (भ्रम से बचने के लिए)। आप न्यूलाइन अक्षरों को पट्टी कर सकते हैं (हालांकि मैं आपको अनुशंसा नहीं करता - इस तरह आप लाइनों के बीच अंतर कर सकते हैं) या पाइथन में तारों के साथ कुछ भी कर सकते हैं।

ध्यान दें कि मैंने फ़ाइल खोलने के लिए एक मोड प्रदान नहीं किया है, इसलिए यह "केवल पढ़ने" के लिए डिफ़ॉल्ट है - यह पायथनिक नहीं है; पायथन में "स्पष्ट से स्पष्ट स्पष्ट है"। अंत में, अच्छे लोग अपनी फाइल बंद करते हैं; इस मामले में यह स्वचालित है (क्योंकि स्क्रिप्ट समाप्त होती है) लेकिन f.close() का उपयोग करके उन्हें बंद करना सबसे अच्छा अभ्यास है।

हैप्पी पाइथनिंग।

संपादित: जैसा कि रोजर पेट से बताया वर्ग कोष्ठक सूची समझ में अनावश्यक हैं, जिससे दो पात्रों द्वारा लाइन को कम करने। मूल स्क्रिप्ट को इसे प्रतिबिंबित करने के लिए संपादित किया गया है।

+2

जब आपको वास्तव में किसी सूची की आवश्यकता नहीं होती है और कोई भी पुनरावर्तनीय काम करेगा, जैसे कि ".join'" के पैरामीटर, तो जनरेटर अभिव्यक्ति बेहतर, आसान (दो कीस्ट्रोक द्वारा;) है, और सूची से अधिक स्पष्ट है समझ: '" ".join (..) '' .join ([..]) के बजाय'। वे संबंधित हैं, और एक एलसी वास्तव में एक genexp का एक विशेष मामला है (कम से कम मेरे विचार में), जहां '[..]' 'सूची (..)' के लिए सुविधा है। http://www.python.org/dev/peps/pep-0289/ –

+0

यह बहुत अच्छा है - हर दिन आप सीखते हैं: +1 – Escualo

+0

आपको फ़ाइल संभाल बंद करें – ghostdog74

-1
s="" 
f=open("file") 
for n,line in enumerate(f): 
    if n<=3 : s=s+line 
    else: 
     # do something here to process the rest of the lines   
print s 
f.close() 
+0

वह परिणाम को एक स्ट्रिंग में देखना चाहता है (नोटिस वह हेडर लिखता है + = ...) – Escualo

+0

वह I मतलब ओपी – Escualo

+1

मुझे लगता है कि यह कार्यान्वयन इस तरह के एक साधारण कार्य के लिए अत्यधिक जटिल है; यह पाइथन पर सी की तरह पढ़ता है - "बैटरी शामिल" दर्शन का लाभ उठाएं और वस्तुओं पर मौजूदा विधियों का उपयोग करें। – Escualo

1

मैं किसी भी बात अपने समाधान के साथ गलत नहीं दिख रहा है, बस _ के साथ मैं की जगह किया जा सकता है, मैं भी हर जगह itertools लागू जहां सरल समाधान काम करेंगे पसंद नहीं है, यह तुच्छ जावास्क्रिप्ट कार्यों के लिए jQuery का उपयोग कर लोगों की तरह है ।वैसे भी अभी itertools बदला यहाँ के लिए आप लाइन, क्यों नहीं बस पहले हेडर पढ़ सकते हैं और उसके बाद जो कुछ भी आप

header = '' 
header_len = 4 

for i, line in enumerate(file_handle): 
    if i < header_len: 
     header += line 
    else: 
     # output chunks to separate files 
     pass 

print header 
0

के बारे में क्या करना चाहते हैं के द्वारा पूरी फ़ाइल वैसे भी लाइन में पढ़ना चाहते हैं के रूप में मेरे समाधान

है :

header = [] 
for i,l in enumerate(file_handle): 
    if i <= 3: 
     header += l 
     continue 
    #proc rest of file here 
0

एक समस्या यह है यह केवल एक स्तर पर समस्या हल करता है, निम्न की तरह कुछ पर विचार करें।

def f(n, m): 
"""A function to run g() n times and run h() m times per g.""" 
    for _ in range(n): 
     g() 
     for _ in range(m): 
      h() 
    return 0 

इस समारोह ठीक काम करता है, लेकिन _ मीटर से अधिक इटरेटर चलाता है समस्याग्रस्त है के रूप में यह ऊपरी के साथ संघर्ष कर सकते हैं _। किसी भी मामले में PyCharm इस तरह के वाक्यविन्यास के बारे में शिकायत कर रहा है।

तो मैं तर्क दूंगा कि _ पहले जैसा सुझाव दिया गया था "फेंकना" नहीं है।

शायद आप इसे करने के लिए बस एक फ़ंक्शन बनाना चाहेंगे!

def run(f, n, *args): 
    """Runs f with the arguments from the args tuple n times.""" 
    for _ in range(n): 
     f(*args) 

उदा। आप इसे इस तरह इस्तेमाल कर सकते हैं:

>>> def ft(x, L): 
...  L.append(x) 

>>> a = 7 
>>> nums = [4, 1] 
>>> run(ft, 10, a, nums) 
>>> nums 
[4, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] 
संबंधित मुद्दे