0

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

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

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

4

3 回答 3

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)
于 2013-05-15T10:24:41.790 回答
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)
于 2013-05-15T10:34:03.887 回答
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)+',')
于 2013-05-15T15:35:15.203 回答