【发布时间】:2013-12-04 20:29:02
【问题描述】:
我正在尝试运行一个大型函数,该函数将通过将大型文本文件拆分为扬声器及其语音,然后将语音进一步处理为组件段落来处理大型文本文件。这是代码:
import os
import re
import csv
from bs4 import BeautifulSoup
def driver(folder, input_filename, output_filename1, output_filename2):
os.chdir(folder)
with open(input_filename, 'r') as f:
Hearing = f.read()
hearing = BeautifulSoup(Hearing)
hearing = hearing.get_text()
hearing = hearing.split("RESPONSE TO WRITTEN")
str (hearing)
speakers = re.findall("\\n Mr. [A-Z][a-z]+\.|\\n Ms. [A-Z][a-z]+\.|\\n Congressman [A-Z][a-z]+\.|\\n Congresswoman [A-Z][a-z]+\.|\\n Chairwoman [A-Z][a-z]+\.|\\n Chairman [A-Z][a-z]+\.", hearing)
speakers = list(set(speakers))
#print speakers
position = []
for speaker in speakers:
x = hearing.find(speakers)
position.append(x)
def find_speaker(hearing, speakers):
position = []
for speaker in speakers:
x = hearing.find(speaker)
if x==-1:
x += 1000000
position.append(x)
first = min(position)
name = speakers[position.index(min(position))]
name_length = len(name)
chunk = [name, hearing[0:first], hearing[first+name_length:]]
#return chunk
chunks = []
#print hearing
names = []
while len(hearing)>10:
chunk_try = find_speaker(hearing, speakers)
hearing = chunk_try[2]
chunks.append(chunk_try[1])
names.append(chunk_try[0].strip())
print len(hearing)#0
chunks.append(hearing)
chunks = chunks[1:]
print len(names)
print len(chunks)
data = zip(names, chunks)
with open(output_filename1,'wb') as f:
w=csv.writer(f)
w.writerow(['Speaker','Speech'])
for row in data:
w.writerow(row)
paragraphs = str(chunks)
print (paragraphs)
Paragraphs = paragraphs.split("\\n")
data1 = zip(Paragraphs)
with open(output_filename2,'wb') as f:
w=csv.writer(f)
w.writerow(['Paragraphs'])
for row in data1:
w.writerow(row)
return True
driver("C:/Users/Documents/Congressional Hearings/NHTF Project/Test Set", 'CHRG-107hhrg70750.htm', 'CHRG-107hhrg70750.csv', 'Paragraphs.csv')
但是,当我运行驱动程序功能时,我收到以下错误:
Traceback (most recent call last):
File "<pyshell#159>", line 1, in <module>
driver("C:/Users/mboogie/Documents/Congressional Hearings/NHTF Project/Test Set", 'CHRG-107hhrg70750.htm', 'CHRG-107hhrg70750.csv', 'Paragraphs.csv')
File "<pyshell#158>", line 9, in driver
speakers = re.findall("\\n Mr. [A-Z][a-z]+\.|\\n Ms. [A-Z][a-z]+\.|\\n Congressman [A-Z][a-z]+\.|\\n Congresswoman [A-Z][a-z]+\.|\\n Chairwoman [A-Z][a-z]+\.|\\n Chairman [A-Z][a-z]+\.", hearing)
File "C:\Python27\lib\re.py", line 177, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
我以为这是指文件 'hearing' 没有带字符串,但是当我尝试 str(hearing) 时,它并没有解决错误。我也很困惑为什么它指的是三行单独的代码。任何建议都将不胜感激 - 我已经坚持了很长一段时间!
【问题讨论】:
-
你认为“str(hearing)”会做什么?
-
它指的是三行代码,因为这就是所谓的;
<module>在第 1 行调用driver,driver在第 9 行调用re.findall(),然后re.findall尝试调用return _compile(...).findall(...),其中引发了TypeError。这称为“回溯”。 -
听证会是一个列表,从拆分,有时只需简单地添加一个打印听证会,就会告诉你问题出在哪里。而 str(hearing) 没有任何帮助,因为它的结果被分配给了任何人。
-
这段代码很难理解,但我不认为嵌套两个
with opens,两者都改变w和f,会做你想做的事。