2013-04-24 11 views
29

मैं इस सरल कोड है:लेखन त्रुटि: उम्मीद स्ट्रिंग या बफ़र

import re, sys 

f = open('findallEX.txt', 'r') 
lines = f.readlines() 
match = re.findall('[A-Z]+', lines) 
print match 

मैं नहीं जानता कि क्यों मैं त्रुटि हो रही है:

'expected string or buffer'

किसी को भी मदद कर सकते हैं?

+1

'f.readlines()' 'f.read()' से बदलें। –

+1

यदि लाइनें 'कोई नहीं' थीं तो आपको एक ही त्रुटि मिल जाएगी जैसे कि आप एक सूची इनपुट करते हैं। यह एक ही परिस्थिति में 're.sub' के साथ भी होगा। इसलिए यह एक टाइपरर (गलत प्रकार दर्ज किया जा रहा है) है। मैं बस इसका जिक्र करता हूं क्योंकि मैंने इस त्रुटि के कारण खोज की और आपकी पोस्ट पाई (और मेरे पास दुर्घटना पर एक गैर प्रकार का था)। – Shule

उत्तर

26

lines एक सूची है। re.findall() सूचियां नहीं लेता है।

>>> import re 
>>> f = open('README.md', 'r') 
>>> lines = f.readlines() 
>>> match = re.findall('[A-Z]+', lines) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/usr/lib/python2.7/re.py", line 177, in findall 
    return _compile(pattern, flags).findall(string) 
TypeError: expected string or buffer 
>>> type(lines) 
<type 'list'> 

help(file.readlines) से। अर्थात। readlines() के लिए छोरों/बार-बार दोहराना है:

readlines(...) 
    readlines([size]) -> list of strings, each a line from the file. 

आपकी फ़ाइल के सभी अपरकेस वर्णों ढूंढने के लिए:

>>> import re 
>>> re.findall('[A-Z]+', open('README.md', 'r').read()) 
['S', 'E', 'A', 'P', 'S', 'I', 'R', 'C', 'I', 'A', 'P', 'O', 'G', 'P', 'P', 'T', 'V', 'W', 'V', 'D', 'A', 'L', 'U', 'O', 'I', 'L', 'P', 'A', 'D', 'V', 'S', 'M', 'S', 'L', 'I', 'D', 'V', 'S', 'M', 'A', 'P', 'T', 'P', 'Y', 'C', 'M', 'V', 'Y', 'C', 'M', 'R', 'R', 'B', 'P', 'M', 'L', 'F', 'D', 'W', 'V', 'C', 'X', 'S'] 
5

lines स्ट्रिंग की एक सूची है, re.findall उस के साथ काम नहीं करता। प्रयास करें:

import re, sys 

f = open('findallEX.txt', 'r') 
lines = f.read() 
match = re.findall('[A-Z]+', lines) 
print match 
4

readlines() फ़ाइल में सभी लाइनों की एक सूची प्रदान करेगा, इसलिए lines एक सूची है। आप शायद कुछ इस तरह हैं:

for line in f.readlines(): # Iterates through every line and looks for a match 
#or 
#for line in f: 
    match = re.findall('[A-Z]+', line) 
    print match 

या, यदि फ़ाइल बहुत बड़ी नहीं है आप एक स्ट्रिंग के रूप में के रूप में यह हड़पने कर सकते हैं:

lines = f.read() # Warning: reads the FULL FILE into memory. This can be bad. 
match = re.findall('[A-Z]+', lines) 
print match 
+3

दरअसल, आप 'रीडलाइन' को पूरी तरह से छोड़ सकते हैं (और यहां तक ​​कि चाहिए): 'f में पंक्ति के लिए' ' – georg

3

अपने टुकड़ा से 'पंक्तियों' शब्द सेट के होते हैं तारों का

lines = f.readlines() 
match = re.findall('[A-Z]+', lines) 

आप re.findall('pattern',<string>)

में पूरे लाइनों नहीं भेज सकते हैं आप लाइन द्वारा लाइन भेजने के लिए कोशिश कर सकते हैं

for i in lines: 
    match = re.findall('[A-Z]+', i) 
    print match 

या एकल लाइन में पूरे लाइनों संग्रह (अंतरिक्ष से अलग प्रत्येक पंक्ति कन्वर्ट करने के लिए)

NEW_LIST=' '.join(lines) 
match=re.findall('[A-Z]+' ,NEW_LIST) 
print match 

यह आपकी मदद कर सकता है

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