2013-04-24 20 views
29

:TypeError: beklenen dize veya tampon Ben bu basit koduna sahip

import re, sys 

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

ben hata alıyorum neden bilmiyorum:

'expected string or buffer'

Herkes yardımcı olabilir?

+1

'f.readlines()' yerine 'f.read()' yazın. –

+1

Satırlar "Yok" ise, bir liste girdiğiniz gibi aynı hatayı alırsınız. Bu aynı durumda "re.sub" ile de meydana gelir. Bu yüzden bir TypeError (yanlış tip giriliyor). Sadece bundan bahsetmiştim, çünkü bu hatanın nedenini araştırdım ve gönderilerinizi buldum (ve kazayla ilgili bir Yazım yok). – Shule

cevap

26

lines bir listedir. re.findall() listeleri almaz.

>>> 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)'dan. Yani readlines() döngüler/iterating içindir:

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

dosyanızda tüm büyük karakterleri bulmak için:

>>> 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 dizeleri listesidir, re.findall bununla çalışmaz.

import re, sys 

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

readlines() dosyadaki tüm hatların listesini döndürür, böylece lines listesi aşağıdadır: deneyin. Dosya, tek dize kadar yakala çok büyük değilse,

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 

Veya: Muhtemelen böyle bir şey istiyorum

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

Aslında, "readlines" öğesini tamamen atlayabilirsiniz (ve hatta): 'f satırında satır için: – georg

3

Snippet'inizdeki gelen 'hatları' terimi kümesinden oluşur dizelerin

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

Sen satır satır göndermek deneyebilirsiniz re.findall('pattern',<string>)

içine tüm satırları gönderemiyorum

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

veya boşlukla ayrılmış tek bir çizgi halinde tüm hatlar koleksiyonu (her satırı dönüştürmek)

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

Bu size yardımcı olabilir

İlgili konular