【问题标题】:Python - Convert tab delimited file into csv in a specific mannerPython - 以特定方式将制表符分隔文件转换为 csv
【发布时间】:2015-07-09 04:18:02
【问题描述】:

我有一个制表符分隔的文本文件,每条记录有 10 列,如下所示:

p001    64      20141209      meals (attendees)    ML   ENTER   Entertainment   xyz Restaurants      6.0     "_e' Restaurants (123) 456-7890 \r\n          FORUM \r\n     ,Around \r\n\r\n':33 113-2 \r\n\r\n 8440 XYZ09'15       1:11PM \r\n\r\n   1 Burger          6.00 \r\n\r\n    SSIONS      6.00 \r\n    TOTAL PAID    6 .00 \r\n    XXXXXXXXXXX2012 XX/XX \r\n    XYZ EXPRESS
6.00 \r\n\r\n\r\n  7,-10( YOU! FOR DINING WITH US! \r\n\r\n         113-2 \r\n\r\nYour r is: 840     \r\n"

P.S:最后一列的文字用“”括起来。而且我的第一列不是唯一的。

我想将此文本文件转换为 csv 文件,以便仅从记录的第 1、2、8、9 和 10 列中选择数据。另外,所有的数据都要用“”括起来。

例如,上述记录应转换为输出 csv 文件中的以下行:

"p001","64","xyz Restaurants","6.0","_e' Restaurants (123) 456-7890 \r\n          FORUM \r\n     ,Around \r\n\r\n':33 113-2 \r\n\r\n 8440 XYZ09'15       1:11PM \r\n\r\n   1 Burger          6.00 \r\n\r\n    SSIONS      6.00 \r\n    TOTAL PAID    6 .00 \r\n    XXXXXXXXXXX2012 XX/XX \r\n    XYZ EXPRESS
    6.00 \r\n\r\n\r\n  7,-10( YOU! FOR DINING WITH US! \r\n\r\n         113-2 \r\n\r\nYour r is: 840     \r\n"

【问题讨论】:

标签: python csv


【解决方案1】:

这应该适合你。请注意,这将csv 库用于输入和输出,我们只需更改文本分隔符。 CSV 应该在您编写文件时自动转义引号字符。

import csv
try:
    with open(r'input.tsv', 'r', newline='\n') as in_f, \
         open(r'output.csv', 'w', newline='\n') as out_f:
        reader = csv.reader(in_f, delimiter='\t')
        writer = csv.writer(out_f, delimiter=',', quoting=csv.QUOTE_ALL)  # Quoting added per comment from @Rob.
        for li in reader:
            try:
                writer.writerow([li[0], li[1], li[2], li[7], li[8], li[9],])
            except IndexError:  # Prevent errors on blank lines.
                pass
except IOError as err:
    print(err)

我无法解析出样本数据中的制表符应位于的位置(而不是空格),但使用input.tsv 的以下数据对其进行了测试:

1   2   3   4   5   6   7   8   9   10
11  12  13  14  15  16  17  18  19  20
21  22  23  24  25  26  27  28  29  30

将在output.csv 中生成以下结果:

"1","2","3","8","9","10"
"11","12","13","18","19","20"
"21","22","23","28","29","30"

更新

请注意,代码中添加 quoting=csv.QUOTE_ALL 的更新是根据 Rob 的 cmets 中的建议进行的。谢谢你的收获!

【讨论】:

  • 我认为您错过了«所有数据都应包含在“”中»。试试csv.writer(out_f, delimiter=',', quoting=csv.QUOTE_ALL)
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多