我有一组100个.txt文件,其中包含以EUC-JP编码的转录日语会话数据。文件名都以' data'开头。我想制作一个程序,根据演讲者是男性还是女性,将句子分成两个不同的文件。每行以M或F加上3位扬声器代码开头。这是我读取文件的代码:
for i in os.listdir(os.getcwd()):
if i.startswith("data") and i.endswith(".txt"):
with codecs.open(i,'r',encoding='EUC-JP') as f:
text = f.read()
有时扬声器的话语会持续几行,因此该行不会以扬声器代码开头。为了解决这个问题,我给当前发言者分配了以下代码
male_speaker_utterances = []
female_speaker_utterances = []
current_speaker = ' '
for l in text:
if l.startswith("F"):
female_speaker_utterances.append(l)
current_speaker = 'F'
elif l.startswith("M"):
male_speaker_utterances.append(l)
current_speaker = 'M'
else:
if current_speaker == 'F':
female_speaker_utterances.append(l)
elif current_speaker == 'M':
male_speaker_utterances.append(l)
最后我将数据写入文件:
fem = codecs.open("female_data.txt",'w',encoding='EUC-JP')
mal = codecs.open("male_data.txt",'w',encoding='EUC-JP')
fem.write(female_speaker_utterances)
mal.write(male_speaker_utterances)
我的问题是我得到的输出格式。当我将文件作为EUC-JP读取时,它只给了我一堆字符代码,如:
[u'F', u'1', u'3', u'5', u'\uff1a', u'\u5973', u'\u6027', u'\uff12', u'\uff10', u'\u4ee3', u'\u5f8c', u'\u534a', u'\u3001', u'\u5317', u'\u6d77', u'\u9053', u'\u672d', u'\u5e4c', u'\u5e02', u'\u51fa', u'\u8eab', u'\u3001', u'\u540c', u'\u5e02', u'\u5728', u'\u4f4f', u'\r', u'\n', u'\uff20', u'\u53c2', u'\u52a0', u'\u8005', u'\u306e', u'\u95a2', u'\u4fc2', u'\uff1a', u'\u5927', u'\u5b66', u'\u9662', u'\u306e', u'\u540c', u'\u7d1a', u'\u751f', u'\r', u'\n'
我希望获得一些可读的文字。将列表写入文件会有问题吗?我不确定如何解决这个问题。在将其写入新文件之前,我尝试将其转换为带有str(female_speaker_utterances)的字符串,但这给了我相同的不可读输出。 我是python和编程的新手,这是我在这里发表的第一篇文章。我使用的是Python 2.7.6。提前谢谢!
答案 0 :(得分:0)
如果您要做的就是将文本拆分为两个单独的文件;当你读到它时,把它写出来要快得多。
您可以使用glob
轻松过滤掉相关文件:
import glob
import codecs
with codecs.open('female.txt', 'w', encoding='EUC-JP') as female,
codecs.open('male.txt', 'w', encoding='EUC-JP') as male:
for filename in glob.iglob('/some/directory/data*.txt'):
with codecs.open(filename, 'r', encoding='EUC-JP') as the_file:
for line in the_file:
# The first letter of each line is either M or F
# The next 3 digits are the speaker code
if line[0] == 'M':
male.write(line)
if line[0] == 'F':
female.write(line)