【问题标题】:converting a space delimited file to a CSV将空格分隔文件转换为 CSV
【发布时间】:2012-01-14 00:11:10
【问题描述】:

我有一个包含表格数据的文本文件。我需要做的是自动执行写入以逗号分隔而不是空格分隔的新文本文件的任务,从现有数据中提取几列,重新排序列。

这是原始数据前4行的sn-p:

行数:8542 算法 |日期 |时间 |经度 |纬度 |国家 1 2000-01-03 215926.688 -0.262 35.813 阿尔及利亚 1 2000-01-03 215926.828 -0.284 35.817 阿尔及利亚

这是我最后想要的:

经度、纬度、国家、日期、时间 -0.262,35.813,阿尔及利亚,2000-01-03,215926.688

关于如何解决这个问题的任何提示?

【问题讨论】:

  • 您的 sn-p 呈现方式有问题,我相信这是您的本意。
  • 是的,这就是我想要的,谢谢!
  • 是的,订单很重要。纬度/经度字段需要是新输出中的前两列
  • 看来 OP 声望达到 20 后才能加入聊天... 我要如何捐给他一些?

标签: python


【解决方案1】:

我猜文件是用制表符分隔的,而不是空格。

如果是这样,您可以尝试以下方法:

input_file = open('some_tab_separated_file.txt', 'r')
output_file = open('some_tab_separated_file.csv', 'w')
input_file.readline() # skip first line 
for line in input_file:
    (a, date, time, lon, lat, country) = line.strip().split('\t')
    output_file.write(','.join([lon, lat, country, date, time]) + '\n')
input_file.close()
output_file.close()

此代码未经测试,任何错误留给您作为练习。

【讨论】:

  • 嗨,看起来这会重新排序字段标题名称。它还会对列中的数据进行重新排序还是还有其他步骤?
  • 提供制表符分隔的,应该在for line in file循环内重新排序标题和数据。
  • 仍在研究您的方法。得到这个:“无法运行脚本 - 语法错误 - 无法分配给文字” 将所有字段名称更改为正确的名称。
  • 你能加入我的chat.stackoverflow.com/rooms/6712/paulos 吗?我会帮你的。
  • Paulo - 我必须有 20 的“声望”才能使用聊天室。回复功能被禁用。我现在 13 点
【解决方案2】:

您可以使用csv 模块和带有' ' 分隔符的读取器来读取您的数据,并使用同一模块中的写入器(带有逗号分隔符)来生成输出。

其实the first example in the csv module documentation使用delimiter=' '

您可以使用DictReader/DictWriter 并在其构造函数中指定列的顺序(fieldnames 列表:如果您想重新排序,则读取器/写入器不同)以按顺序输出条目你愿意。

(您可能需要在生成输出时跳过/忽略前两行。)

编辑:

这里是一个处理多词国家名称的例子:

import cStringIO
import csv

f = cStringIO.StringIO("""A B C
1 2 Costa Rica
3 4 Democratic Republic of the Congo
""")

r = csv.DictReader(f, delimiter=' ', restkey='rest')
for row in r:
    if row.get('rest'):
        row['C'] += " %s" % (" ".join(row['rest']))
    print 'A: %s, B: %s, C: %s' % (row['A'], row['B'], row['C'])

使用restkey= 并连接该值的dict 条目,这是剩余内容的列表(此处为restkey='rest')。这打印:

A: 1, B: 2, C: Costa Rica
A: 3, B: 4, C: Democratic Republic of the Congo

【讨论】:

  • 如果你使用delimiter=' ',像“哥斯达黎加”这样的国家会发生什么?
  • @PauloScardine,您应该可以为此使用restkey(请参阅更新)。当然,在最初的示例中,这将需要对前两行进行一些清理,但即使使用普通的(非DictReader),也应该可以获得剩余的内容并将其连接在一起。跨度>
【解决方案3】:

str.split() 不带任何参数将被任意长度的空格分割。 operator.itemgetter() 接受多个参数,并将返回一个元组。

【讨论】:

    【解决方案4】:

    我想重要的想法是你必须使用 '\t' 作为分隔符@Paulo Scardine。

    我只是想补充一点,pandas 是一个非常好的处理列数据的库。

    >>> src = 'path/to/file'
    >>> dest = 'path/to/dest_csv'
    >>> column_names = ['names', 'of', 'columns']
    
    >>> df = pd.read_csv(src, delimiter='\t', names=column_names)
    
    # Do something in pandas if you need to
    
    >>> df.to_csv(dest, index=False, sep = ';')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2020-09-01
      • 2020-06-24
      相关资源
      最近更新 更多