从几个文件中排序数据会产生不可读的输出?

时间:2014-12-17 11:30:43

标签: python-2.7 character-encoding

我有一组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。提前谢谢!

1 个答案:

答案 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)