如何将以竖线分隔的文本文件转换为CSV文件?

4

我有一个大文本文件,想用Python将其转换为CSV格式。我的数据如下:

var1|var2|var3|tonumber|fromnumber|var|coding|udh|var|circle|var|var|var|var15

898980d1-6e5b-40f2-a313-c30f08bf0fe6|49A5919EB0D04EDE9B6CEB5AF932EAA3|sbs1|919899980898|HITECH|1|1|0|VODAFONE|Delhi|2015-02-21 12:08:51|5|3|RBA/6724R # Kailash Ram Panwar (PL) # Rz-410/13 Flat No-09 Iiird Floor Tkd Extn Delhi - 110019-110019 # Tgt Skt #  #

我该如何将这个文件转换为CSV格式?我尝试了以下方法:
In [1]: import csv

In [2]: import pandas as pd

In [3]: piperows = []  

f = open("/home/suri/ValueFirst/MT.txt", "rb")

In [6]: readerpipe = csv.reader(f, delimiter = '|')

In [7]: for row in readerpipe: 
   ...:     piperows.append(row)
   ...:     f.close()  
   ...:  

我遇到了以下错误:

----------------------------------------------------
ValueError                      Traceback (most recent call last)  
<ipython-input-7-842b0d42f436> in <module>()  
----> 1 for row in readerpipe:  
      2     piperows.append(row)  
      3     f.close()  
      4   

ValueError: I/O operation on closed file  
2个回答

8

就像@Martijn Pieters建议的那样,你不应该这样缩进f.close(),因为它现在是循环的一部分。我建议使用一个with块,它会自动关闭文件。

import csv

with open("/home/suri/ValueFirst/MT.txt", "rb") as f:
    readerpipe = csv.reader(f, delimiter='|')
    piperows = list(readerpipe)

这里有一件事情需要注意,我们建立了所有行的大列表,如果你正在转换文件,这可能不是一个好主意。当你读取管道分隔版本时,你可以同时编写新的逗号分隔版本。

import csv

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe:
    reader_pipe = csv.reader(file_pipe, delimiter='|')
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma:
        writer_comma = csv.writer(file_comma, delimiter=',')
        for row in reader_pipe:
            writer_comma.writerow(row)

编辑: @Martijn建议直接将读取器传递给写入者的writerows方法...如果这个writerows方法实现正确,它会产生相同的效果并避免一次性加载所有行。

import csv

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe:
    reader_pipe = csv.reader(file_pipe, delimiter='|')
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma:
        writer_comma = csv.writer(file_comma, delimiter=',')
        writer_comma.writerows(reader_pipe)

编辑2:代码变得非常简单,您可以内联阅读器和写入器变量,并在喜欢的情况下获得以下结果...

import csv

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe:
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma:
        csv.writer(file_comma, delimiter=',').writerows(csv.reader(file_pipe, delimiter='|'))

我需要一个像CSV格式的数据,它应该长这样: 变量 变量1 变量2 变量3 xyt cagf sfgb sgsg afff afgg sggg aggb上述答案会提供这种类型的数据吗?请以此方式帮助我。 - surendra
我提出的代码将把一个看起来像 header1|header2|header3 var1|var2|var3 的文件转换成 header1,header2,header3 var1,var2,var3。如果您需要其他内容,请编辑您的问题以使其更清晰:这比行内注释更易读 ;) - snooze92

1

在读取第一行后,您正在关闭文件:

for row in readerpipe: 
    piperows.append(row)
    f.close()  

从循环中删除f.close()这行代码。
更好的做法是将文件作为上下文管理器使用,这样它会自动关闭。您可以直接在读取器上调用list()来生成输出列表:
with open("/home/suri/ValueFirst/MT.txt", "rb") as f:
    readerpipe = csv.reader(f, delimiter = '|')
    piperows = list(readerpipe)

但是要转换您的文件,您可以将readerpipe直接传递到writer.writerows()调用中:

with open("/home/suri/ValueFirst/MT.txt", "rb") as f:
    readerpipe = csv.reader(f, delimiter = '|')
    with open("/home/suri/ValueFirst/MT.txt", "wb") as outputfile:
        writer = csv.writer(outputfile)
        writer.writerows(readerpipe)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接