如何将txt文件转换为CSV?

时间:2014-01-20 04:12:23

标签: python csv

我有一个包含“5个值”的文本文件。我有以下信息

[LENGTH, START INDEX(1 instead of 0), TYPE]
[4, 1, "TypeA"]
[11, 5, "TypeB"]
[5, 16, "Charles"]

假设必须为每行文本处理这些指令,那么在python中逐行执行此操作的最有效方法是从输入文件生成CSV(请注意,空格和字符无关紧要对于线的任何变化。相同的说明适用)?

即。如果这是文件中的一行:

ABCD EFGHIJK LMNOP QR

基于上述说明的处理行的“csv版本”结果将是:

"ABCD ", "EFGHIJK LMN", "OP QR"

没有尾随空格将是:

  

“ABCD”,“EFGHIJK LMN”,“OP QR”

2 个答案:

答案 0 :(得分:1)

获得列表后,只需在其所有元素上使用strip

data = [s.strip() for s in line]

演示:

>>> line = ["ABCD ", "EFGHIJK LMN", "OP QR"]
>>> data = [s.strip() for s in line]
>>> data
['ABCD', 'EFGHIJK LMN', 'OP QR']

答案 1 :(得分:1)

正如我在评论中提到的,我没有看到你的规格如何与你想要的输出相匹配 - 它们似乎并不一致。因此,就本答案而言,我将更改您的TypeA“指令”,以使其与其他指令保持一致。

但是,您可以使用字符串切片和csv模块将固定宽度格式文件转换为csv。例如,像

import csv

specs = [[5, 0, "TypeA"],
         [11, 5, "TypeB"],
         [5, 16, "Charles"]]

with open("filename.txt") as infile, open("out.csv", "wb") as outfile:
    writer = csv.writer(outfile, quoting=csv.QUOTE_ALL)
    names = [s[-1] for s in specs]
    writer.writerow(names)
    for line in infile:
        row = [line[start:start+length] for length, start, name in specs]
        writer.writerow(row)

会产生

dsm@notebook:~/coding$ cat out.csv 
"TypeA","TypeB","Charles"
"ABCD ","EFGHIJK LMN","OP QR"

如果您要对表格数据进行大量处理,那么我建议您查看pandas库,这样可以更加简单:

import pandas as pd, csv
df = pd.read_fwf("filename.txt", widths=(5,11,5), names=["TypeA", "TypeB", "Charles"])
df.to_csv("out.csv", index=False, quoting=csv.QUOTE_ALL)