我已阅读有关错误的所有帖子,但仍无法弄清楚如何调试我的具体问题。
从命令行,我正在读取csv文件。
adamg:NLP adamg$ python3 train_classifier.py samples.csv /Users/adamg/PycharmProjects/NLP/samples
如果我将其作为字节文件打开,就像这样:
training_pages_list_file = sys.argv[1]
with open(training_pages_list_file,'rb') as f:
reader = csv.reader(f)
training_page_list.extend(reader)
我收到错误:
File "train_classifier.py", line 17, in <module>
training_page_list.extend(reader)
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
但是,如果我将其更改为读取文本文件,或者不进行编码,则在将字符串传递给BeautifulSoup
对象时会出错:
training_pages_list_file = sys.argv[1]
html_page_dir = sys.argv[2]
with open(training_pages_list_file,'r') as f:
reader = csv.reader(f)
training_page_list.extend(reader)
for page,category in training_page_list:
cp = CraigsPage(os.path.join(html_page_dir,page))
CraigsPage.py
class CraigsPage():
def __init__(self, page_file):
self.doc_name = page_file
self.soup = BeautifulSoup(open(page_file).read())
self.title = self.soup.title.string
我收到错误:
File "train_classifier.py", line 22, in <module>
cp = CraigsPage(os.path.join(html_page_dir,page))
File "/Users/adamg/PycharmProjects/NLP-HW1/craiger.py", line 15, in __init__
self.page = open(page_file).read()
File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 6646: ordinal not in range(128)
我该如何解决这个问题?
答案 0 :(得分:2)
在Python 3中,csv
想要文本,所以不要给它字节(文件打开为'rb'
)。如果文件不是ascii文本,则必须对其进行解码:
with open(training_pages_list_file, encoding='iso-8859-1') as f:
或该CSV文件中使用的其他任何编码名称。
如果是python 2,import codecs
并且类似地使用codecs.open
而不是内置open
(在py2中可以处理编码/解码)。或者等效地import io
并使用io.open
。
与其他open
类似 - 您需要告知它每个页面文件的编码。
如果您不知道哪个文件使用哪种编码,那么您就会遇到麻烦,因为您可以做的最好的就是猜测;一个体面的猜测者是https://pypi.python.org/pypi/chardet,但 仍然只是猜测。
就像一个二进制数据文件,没有关于如何布局其记录的信息,编码的文本文件没有关于编码的信息是一个真正可怕的想法,并且你&#39;我需要一些侦探/考古/法医工作,还有一点运气。