我在使用以下文件时遇到了一些问题。 每行包含以下内容:
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不是一种选择。
仅仅正则表达每一行会更好吗? 如果是这样,有人能指出我的方向吗?
答案 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)+',')