2013-04-24 45 views
29

tôi có mã đơn giản này:Lỗi Loại: dự kiến ​​chuỗi hoặc đệm

import re, sys 

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

Tôi không biết tại sao tôi nhận được lỗi:

'expected string or buffer'

bất cứ ai có thể giúp đỡ?

+1

Thay thế 'f.readlines()' bằng 'f.read()'. –

+1

Nếu các dòng là 'None', bạn sẽ gặp lỗi tương tự ở đây như thể bạn nhập danh sách. Điều này cũng sẽ xảy ra với 're.sub' trong cùng hoàn cảnh. Do đó nó là một TypeError (loại sai được nhập). Tôi chỉ đề cập đến điều này bởi vì tôi đã tìm kiếm những gì gây ra lỗi này và tìm thấy bài viết của bạn (và tôi đã có một Nonetype trên tai nạn). – Shule

Trả lời

26

lines là danh sách. re.findall() không có danh sách.

>>> 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'> 

Từ help(file.readlines). I E. readlines() là cho vòng/iterating:

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

Để tìm tất cả ký tự chữ hoa trong tập tin của bạn:

>>> 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 là một danh sách các chuỗi, re.findall không hoạt động với điều đó. thử:

import re, sys 

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

readlines() sẽ trả về một danh sách tất cả các dòng trong tập tin, vì vậy lines là một danh sách. Bạn có thể muốn một cái gì đó như thế này:

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 

Hoặc, nếu các tập tin không phải là quá lớn, bạn có thể lấy nó như là chuỗi duy nhất:

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

Trên thực tế, bạn có thể (và thậm chí nên) bỏ qua 'readlines' hoàn toàn:' cho dòng trong f: ' – georg

3

hạn 'dòng' từ đoạn mã của bạn bao gồm bộ của chuỗi.

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

Bạn không thể gửi toàn bộ dây chuyền vào re.findall('pattern',<string>)

Bạn có thể thử để gửi từng dòng

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

hoặc để chuyển đổi bộ sưu tập toàn bộ dòng vào dòng đơn (mỗi dòng tách bởi không gian)

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

Điều này có thể giúp bạn

Các vấn đề liên quan