2013-05-15 78 views
0

我遇到以下文件的一些問題。 的每一行都具有以下內容:更改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 

什麼是實現這一目標的最簡單的Python的方式? 起初我使用了csv.reader,但我發現它不是製表符分隔的,而是隨機的(3-5)空格。 我已經閱讀過CSV模塊和一些例子/類似的問題,但是我的python知識並不好,當你想編輯一行的值時,CSV模塊看起來非常困難。 我可以在Excel中導入和編輯這個沒有問題,但我想用它在一個Python腳本,因爲我有這些文件數以百計。 Excel中的VBA不是一種選擇。

只是將每條線正則表達會更好嗎? 如果是這樣,有人可以用一個例子指出我的方向嗎?

回答

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) 
+0

謝謝!完美的例子,尤其是倒數的部分,我編碼完全錯誤的第一個地方。 – Ruud

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) 
+0

非常感謝,Neg運算符找到了。以前沒見過那個。 – Ruud

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)+',')