0

我是 Python 新手,我正在尝试获取一些具有以下格式数据的文本文件:

时间戳持续时间 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 公顷(01) 0.04941113 ah(01) 0.04552169 oo(01) 0.01065865 o(01) 0.00219633

187.110 0.410 邦加(01) 1.00000000

187.520 0.349 纳曼(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 文件编译成电子表格之类的东西有任何其他建议,这样可以更容易地分析数据,我将不胜感激。

4

3 回答 3

3

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

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

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

应该是:

for row in reader:
    writer.writerow([each_file] + row)
于 2013-10-03T15:27:05.080 回答
0

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

其次,看起来您的输入文件是空格分隔的,但您创建的阅读器使用默认的逗号分隔。您可能想尝试传入分隔符:

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

希望这可以帮助!

于 2013-10-03T15:25:09.850 回答
0

尝试使用简单的文本编辑器打开文件。可能问题不在您的代码中。一些电子表格应用程序使用“,”作为分隔符。其他人使用“;” 甚至“”或制表符。如果文件看起来像它应该的样子,请尝试使用不同的分隔符

于 2013-10-03T15:26:32.747 回答