2010-02-02 9 views
11

मेरे पास एक बहुत लंबी टेक्स्ट फ़ाइल है जिसे मैं पायथन का उपयोग करके संसाधित करने की कोशिश कर रहा हूं।पायथन सोचता है कि 3000-लाइन टेक्स्ट फ़ाइल एक पंक्ति लंबी है?

हालांकि

, निम्नलिखित कोड:

for line in open('textbase.txt', 'r'): 
    print 'hello world' 

केवल निम्नलिखित उत्पादन का उत्पादन:

hello world 

यह हालांकि यह लाइनों के कई हजारों है, जैसे कि अजगर सोचता है कि फ़ाइल केवल एक ही लाइन में लंबे समय है लंबे, जब एक पाठ संपादक में देखा। फ़ाइल आदेश का उपयोग कमांड लाइन पर यह जांच देता है:

$ file textbase.txt 
textbase.txt: Big-endian UTF-16 Unicode English text, with CR line terminators 

कुछ गलत है? क्या मुझे लाइन टर्मिनेटर बदलने की ज़रूरत है?

+0

क्या ओएस आप पर कर रहे हैं? –

+0

@OP, textbase.txt कहां से आता है? विंडोज? फ़ाइल पर dos2unix करने का प्रयास करें और देखें कि यह समस्या हल हो गई है – ghostdog74

+0

@jldupont: मुझे लगता है कि एपी 257 ने इनपुट फ़ाइल की प्रत्येक पंक्ति के लिए "हैलो वर्ल्ड" प्रिंट करने की अपेक्षा की है, जैसे कि कोड कहता है :-) – paxdiablo

उत्तर

6

आपको शायद यह "सीआर लाइन टर्मिनेटर" के साथ मिल जाएगा जो गेम को दूर देता है। यदि आप प्लेटफॉर्म पर काम कर रहे हैं जो लाइन टर्मिनेटर के रूप में न्यूलाइन का उपयोग करता है, तो आपकी फ़ाइल को एक बड़ी honkin 'लाइन के रूप में देखेगा।

अपनी इनपुट फ़ाइल बदलें ताकि यह सही लाइन टर्मिनेटर का उपयोग करे। आपका संपादक शायद आपके पायथन कार्यान्वयन से अधिक क्षमाशील है।

सीआर लाइन समाप्ति एक मैक चीज है जहां तक ​​मुझे पता है और आप U मोड संशोधक open पर पहले लाइन टर्मिनेटर के आधार पर स्वत: पता लगाने के लिए उपयोग कर सकते हैं।

+0

'नाखून + हेड' कॉम्बो मुझे लगता है। +1। –

+0

धन्यवाद। कोई विचार क्या मुझे उन्हें बदलने की जरूरत है? – AP257

+0

मैं कहूंगा \ n'। –

-1

open() एक फ़ाइल ऑब्जेक्ट देता है। जो तार यह आप देता में \n करने के लिए उन्हें को सामान्य,

open('textbase.txt', 'Ur') 

यह सक्षम बनाता है "universal newlines":

for line in open('textbase.txt', 'r').readlines(): 
    print line 
+2

यह आवश्यक नहीं है, क्योंकि खुली फ़ाइल वस्तु एक पुनरावर्तक की तरह व्यवहार करती है। –

+0

कोई फर्क नहीं पड़ता, माफ करना ... – AP257

+0

आह ... अच्छा बिंदु। उस पर अनुचित नहीं था। – Paul

25

documentation for open() के अनुसार, यदि आप एक U मोड में जोड़ना चाहिए: आप उपयोग करने की आवश्यकता ।

हालांकि, नई बातों का अनुवाद करने से पहले यूटीएफ -16 बीई को यूनिकोड ऑब्जेक्ट्स पहले में डीकोड करना सही है। अन्यथा, एक मौका 0x0d बाइट ग़लती से एक 0x0a में बदल गया हो सकता है,

में जिसके परिणामस्वरूप

UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 12: truncated data.

पायथन के codecs module आपूर्ति एक open समारोह है कि यूनिकोड को डिकोड और एक ही समय में नई-पंक्तियों संभाल कर सकते हैं:

import codecs 
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'): 
    ... 

हैं फ़ाइल में बाइट ऑर्डर मार्क (बीओएम) है और आप 'utf-16' निर्दिष्ट करते हैं, फिर यह अंतहीनता का पता लगाता है और आपके लिए बीओएम छुपाता है। यदि ऐसा नहीं होता है (चूंकि बीओएम वैकल्पिक है), तो वह डिकोडर आगे बढ़ेगा और आपके सिस्टम की अंतहीनता का उपयोग करेगा, जो शायद अच्छा नहीं होगा।

endianness अपने आप को ('utf-16be' के साथ) को निर्दिष्ट करना बीओएम छिपा नहीं होगा, ताकि आप इस हैक का उपयोग करना चाहते हो सकता है:

import codecs 
firstline = True 
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'): 
    if firstline: 
     firstline = False 
     line = line.lstrip(u'\ufeff') 

भी देखें: Python Unicode HOWTO

+0

सिर्फ विश्लेषण के बजाय समाधान के लिए +1 (मेरे उत्तर में) - आप मेरे लिए बहुत तेज़ थे :-) – paxdiablo

+0

समस्या हल करता है, पाइथन अब सभी लाइनों को देखता है। बहुत बहुत धन्यवाद: मुझे इस साइट से प्यार है :) – AP257

+1

@ एपी 257: क्या वे ठीक से डीकोड भी करते हैं? यदि यह वास्तव में यूटीएफ -16 बीई है, तो प्रत्येक पंक्ति के सामने शून्य बाइट होगा, क्योंकि पाइथन की फ़ाइल ऑब्जेक्ट एन्कोडिंग-अनजान है और केवल न्यूलाइन अक्षरों पर विभाजित है। आईएमएचओ, आपको लाइनों में विभाजित होने से पहले फ़ाइल को (कोडेक्स मॉड्यूल का उपयोग करके) को डीकोड करना होगा। –

1

यह आपकी फ़ाइल की तरह लग रहा लाइनों समाप्त कर दिया है केवल सीआर द्वारा, और पायथन शायद एलएफ या सीआरएलएफ की उम्मीद कर रहा है। 'सार्वभौमिक न्यू लाइन' का उपयोग कर प्रयास करें:

for line in open('textbase.txt', 'rU'): 
    print 'hello world' 

http://docs.python.org/library/functions.html?highlight=open#open

संबंधित मुद्दे