Python - 写入CSV文件将所有文本吐出到一个单元格中

时间:2013-10-03 15:19:03

标签: python csv python-2.7

我是Python的新手,我正在尝试使用以下格式的数据文本文件:

time_stamp duration word1 p1 word2 p2 ....

并将数据写入CSV文件。对于我写入的每一行,我还想包括从中获取该行的文件的名称。

我的问题是我正在执行的代码似乎将所有文本写入一个单元格。当我使用LibreOffice打开CSV文件时,它会显示垃圾字符,表示无法正确显示数据,因为超出了每个单元格的最大字符数限制。

我做错了什么?

import csv, os

path = "./TRIAL with CSV"
all_the_files = os.listdir(path)

for each_file in all_the_files:
    file = os.path.join(path, each_file)
    ifile  = open(file, "rb")
    reader = csv.reader(ifile)
    ofile  = open('CSVtrial.csv', "a")
    writer = csv.writer(ofile, delimiter='\t', quoting=csv.QUOTE_MINIMAL)

    for row in reader:
        writer.writerow([each_file,row])


ifile.close()
ofile.close()

编辑:我认为我不能在这里附加文件,但是示例输入文件将是.txt文件,其中包含以下行:

186.860 0.060(01)0.89221220 ha(01)0.04941113 ah(01)0.04552169 oo(01)0.01065865 o(01)0.00219633

187.110 0.410 bongga(01)1.00000000

187.520 0.349 naman(01)0.99999601

187.872 0.598 niyan(01)0.81980968'yan(02)0.16510634 iyan(02)0.00814381 niya(01)0.00471968 ganyan(01)0.00139249 diyan(03)0.00082159

有大约50,000个这样的.txt文件,我正在尝试将其编译成单个CSV文件,以便更轻松地分析数据。

以下是我尝试在LibreOffice中查看CSV文件时出现的错误的屏幕截图 - http://i.imgur.com/jvsvxrx.png?1

现在我已经放弃了这一点,我只是想在vim上工作。如果有人对如何将这些.txt文件编译成类似电子表格的内容提出任何其他建议,这样可以更容易地分析数据,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

假设分隔符是正确的,这看起来是错误的:

for row in reader:
    writer.writerow([each_file,row])

因为那将创建一个恰好有两列的行,其中第二个单元格将包含整个原始行,序列化。

应该是:

for row in reader:
    writer.writerow([each_file] + row)

答案 1 :(得分:0)

首先,与您的问题无关:您确定需要制表符分隔符吗?也许以逗号分隔的输出会更好。

其次,看起来您的输入文件是SPACE分隔的,但是您创建了具有默认COMMA分隔符的阅读器。您可能想尝试传递分隔符:

reader = csv.reader(ifile, delimiter=' ')

不确定这是否有帮助,一些样本数据可能有用,所以我可以在这里捣乱。

编辑:我也注意到你试图将文件连接成一个文件?我在这个假设中是否正确?

为此,我可能会使用其他(即unix)工具来更快地完成这项工作。如果您的目标是在python中做一些有趣的事情,我的建议可能是在循环外声明一个编写器,而不是使用追加模式重新打开相同的文件。

EDIT2:在不了解您的代码的情况下,我可能会按如下方式处理:

writer = csv.writer(open('CSVTrial.csv', 'w'), delimiter='\t', quoting=csv.QUOTE_MINIMAL)
for each_file in all_the_files:
    file = os.path.join(path, each_file)
    with open(file, "rb") as ifile:
        reader = csv.reader(ifile, delimiter=" ")
        for row in reader:
            writer.writerow([each_file] + row)
ofile.close()

当然注意读者文件中的with语句是为了避免文件中的显式close()。作者可以有一个明确的关闭或你可以使用相同的治疗。即使异常发生,输入文件也保证关闭也很好。你必须确保输出文件关闭,使用一些try ... catch ... finally

希望这有帮助!

答案 2 :(得分:0)

尝试使用简单的文本编辑器打开文件..可能问题不在您的代码中。某些电子表格应用使用“,”作为分隔符。其他人用“;”甚至“”或标签。 如果文件看起来应该是什么,请尝试使用不同的分隔符