2013-04-24 11 views
29

ho questo semplice codice:TypeError: atteso stringa o buffer

import re, sys 

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

Non so perché sto ottenendo l'errore:

'expected string or buffer'

chiunque può aiutare?

+1

Sostituisci 'f.readlines()' di 'f.read()'. –

+1

Se le righe fossero 'None' si otterrebbe lo stesso errore qui se si inserisce un elenco. Ciò si verifica anche con 're.sub' nella stessa circostanza. Quindi è un errore TypeE (il tipo errato inserito). Ho appena detto questo perché ho cercato ciò che ha causato questo errore e trovato il tuo post (e ho avuto un Nonetype in caso di incidente). – Shule

risposta

26

lines è un elenco. re.findall() non accetta elenchi.

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

Da help(file.readlines). Cioè readlines() è per cicli/iterazione:

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

per trovare tutti i caratteri maiuscoli nel 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 è una lista di stringhe, re.findall non funziona con questo. Prova:

import re, sys 

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

readlines() restituirà un elenco di tutte le righe nel file, in modo da lines è una lista. Probabilmente si desidera qualcosa di simile:

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 

Oppure, se il file non è troppo grande si può afferrare come singola stringa:

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

In realtà, puoi (e anche dovrebbe) saltare "readlines" del tutto: 'for line in f:' – georg

3

termine 'linee' dal frammento è costituito da serie di stringhe.

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

Non è possibile inviare intere linee nel re.findall('pattern',<string>)

Si può provare a inviare riga per riga

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

o per convertire l'intera collezione righe in un'unica riga (ogni riga separati da spazio)

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

Questo potrebbe aiutare

Problemi correlati