更改CSV或文本样式文件中的值

时间:2013-05-15 10:23:21

标签: python csv

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

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不是一种选择。

仅仅正则表达每一行会更好吗? 如果是这样,有人能指出我的方向吗?

3 个答案:

答案 0 :(得分:3)

您可以使用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)

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

您可以使用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)+',')