【问题标题】:Change values in CSV or text style file更改 CSV 或文本样式文件中的值
【发布时间】:2013-05-15 10:23:21
【问题描述】:

我在使用以下文件时遇到了一些问题。 每行有以下内容:

foobar   1234.569    7890.125     12356.789   -236.4569   236.9874   -569.9844

我想在这个文件中编辑的是反转最后三个数字,正数或负数。 输出应该是:

foobar   1234.569    7890.125     12356.789   236.4569   -236.9874   569.9844

甚至更好:

foobar,1234.569,7890.125,12356.789,236.4569,-236.9874,569.9844

最简单的pythonic方法是什么? 起初我使用 csv.reader,但我发现它不是制表符分隔的,而是随机(3-5)个空格。 我在这里阅读了 CSV 模块和一些示例/类似问题,但是我对 python 的了解不是很好,而且当你想编辑一行的值时,CSV 模块似乎很难。 我可以毫无问题地在 excel 中导入和编辑它,但我想在 python 脚本中使用它,因为我有数百个这样的文件。 excel 中的 VBA 不是一个选项。

只对每一行进行正则表达式会更好吗? 如果是这样,有人可以举例说明我的方向吗?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您可以使用str.split() 将空格分隔的行拆分为一行:

    row = line.split()
    

    然后使用csv.writer() 创建您的新文件。

    str.split() 不带参数,或None 作为第一个参数,在任意宽度的空白处拆分并忽略行中的前导和尾随空白:

    >>> 'foobar   1234.569    7890.125     12356.789   -236.4569   236.9874   -569.9844\n'.split()
    ['foobar', '1234.569', '7890.125', '12356.789', '-236.4569', '236.9874', '-569.9844']
    

    作为一个完整的脚本:

    import csv
    
    with open(inputfilename, 'r') as infile, open(outputcsv, 'wb') as outfile:
        writer = csv.writer(outfile)
    
        for line in infile:
            row = line.split()
            inverted_nums = [-float(val) for val in row[-3:]]
            writer.writerow(row[:-3] + inverted_nums)
    

    【讨论】:

    • 谢谢!完美的例子,尤其是inverted_nums部分,我一开始就完全错误地编码了。
    【解决方案2】:
    from operator import neg
    with open('file.txt') as f:
        for line in f:
            line = line.rstrip().split()
            last3 = map(str,map(neg,map(float,line[-3:])))
            print("{0},{1}".format(line[0],','.join(line[1:-3]+last3)))
    

    生产:

    >>> 
    foobar,1234.569,7890.125,12356.789,236.4569,-236.9874,569.9844
    

    CSV 输出版本:

    with open('file.txt') as f, open('ofile.txt','w+') as o:
        writer = csv.writer(o)
        for line in f:
            line = line.rstrip().split()
            last3 = map(neg,map(float,line[-3:]))
            writer.writerow(line[:-3]+last3)
    

    【讨论】:

    • 谢谢,用 Neg 运算符很好地发现。以前没见过。
    【解决方案3】:

    你可以使用genfromtxt:

    import numpy as np
    
    a=np.genfromtxt('foo.csv', dtype=None)
    with open('foo.csv','w') as f:
    for el in a[()]:
        f.write(str(el)+',')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 2016-02-04
      • 2017-06-05
      • 2018-03-28
      • 2012-02-11
      • 2012-06-14
      • 1970-01-01
      • 2015-09-27
      相关资源
      最近更新 更多