2016-07-29 26 views
0

我有不同的文本文件,我想從那裏提取值到一個csv文件。 每個文件的格式如下將文本文件提取到python中的多列

main cost: 30 
additional cost: 5 

我能夠做到這一點,但問題是我希望它的每個文件的值插入到一個不同的列我也想文本文件的數量是用戶爭論

這是我現在在做什麼

numFiles = sys.argv[1] 
    d = [[] for x in xrange(numFiles+1)] 
    for i in range(numFiles): 
     filename = 'mytext' + str(i) + '.text' 
     with open(filename, 'r') as in_file: 
     for line in in_file: 
     items = line.split(' : ') 
     num = items[1].split('\n') 

     if i ==0: 
      d[i].append(items[0]) 

     d[i+1].append(num[0]) 

     grouped = itertools.izip(*d[i] * 1) 
     if i == 0: 
      grouped1 = itertools.izip(*d[i+1] * 1) 

     with open(outFilename, 'w') as out_file: 
      writer = csv.writer(out_file) 
      for j in range(numFiles): 
       for val in itertools.izip(d[j]): 
        writer.writerow(val) 

這就是我現在得到,一切都在一列

main cost 
additional cost 
30 
5 
40 
10 

,我想這是

main cost  | 30 | 40 
additional cost | 5 | 10 
+0

你試圖使用的元組? –

+0

最後一列來自期望輸出的位置?每個輸入文件中只有兩行? – wwii

+0

我假設輸入文件看起來像: 主要成本:30 額外費用:5 主要成本:40 額外費用:10個 – Michael

回答

2

你可以用字典來做到這一點,其中的關鍵將是「頭」你想使用的值是一個列表。

因此,它看起來像someDict = {'main cost': [30,40], 'additional cost': [5,10]}

EDIT2:說幹就幹,清理這個答案,因此使得一些更有意義。

你可以建立字典和遍歷像這樣:

from collections import OrderedDict 

in_file = ['main cost : 30', 'additional cost : 5', 'main cost : 40', 'additional cost : 10'] 
someDict = OrderedDict() 

for line in in_file: 
    key,val = line.split(' : ') 
    num = int(val) 
    if key not in someDict: 
     someDict[key] = [] 

    someDict[key].append(num) 

for key in someDict: 
    print(key) 
    for value in someDict[key]: 
     print(value) 

代碼輸出:

main cost 
30 
40 
additional cost 
5 
10 

應該是相當簡單的修改,以適應所需輸出的例子。

我使用@append multiple values for one key in Python dictionary的例子,並感謝@wwii的一些建議。

我使用了,因爲字典不會保持按鍵順序。

可以運行我的例子@https://ideone.com/myN2ge

+0

對於這個解決方案,你可以確定只有兩個鍵,所以你可以用這兩個鍵和一個空的值列表構建字典 - 然後你可以擺脫'''if/else''爲字典賦值。或者,如果您事先不確定密鑰,可以使用['''collections.defaultdict'''](https://docs.python.org/3/library/collections.html#collections.defaultdict)。 – wwii

+1

當您在代碼中分割文本並計劃使用單個項目時,最好給它們起個名字 - 這使得後續代碼更易於閱讀。利用解包:在這種情況下 - '''key,value = line.split(':'); value = value.strip()''' – wwii

+0

這兩個很好的例子。首先,我可能會保持它的方式,以便在將來無需修改代碼即可更改文件格式。我同意你的第二個例子。 – Michael

0

這是我怎麼可能做到這一點。假設所有文件中的字段都是相同的。製作名稱列表,以及使用這些字段名稱作爲關鍵字的字典以及值列表作爲條目。而不是在file1.textfile2.text等上運行,以file*.text作爲命令行參數運行腳本。

#! /usr/bin/env python 

import sys 

if len(sys.argv)<2: 
    print "Give file names to process, with wildcards" 
else: 
    FileList= sys.argv[1:] 
    FileNum = 0 
    outFilename = "myoutput.dat" 
    NameList = [] 
    ValueDict = {} 
    for InfileName in FileList: 
     Infile = open(InfileName, 'rU') 
     for Line in Infile: 
      Line=Line.strip('\n') 
      Name,Value = Line.split(":") 
      if FileNum==0: 
       NameList.append(Name.strip()) 
      ValueDict[Name] = ValueDict.get(Name,[]) + [Value.strip()] 
     FileNum += 1 # the last statement in the file loop 
     Infile.close() 
    # print NameList 
    # print ValueDict 

    with open(outFilename, 'w') as out_file: 
     for N in NameList: 
      OutString = "{},{}\n".format(N,",".join(ValueDict.get(N))) 
      out_file.write(OutString) 

輸出爲我的四個假文件是:

main cost,10,10,40,10 
additional cost,25.6,25.6,55.6,25.6 
+0

謝謝@beroe,但我希望輸出保存在csv文件中,'|'表示不同的列 – Lily

+0

只需更改'| | '在代碼中以逗號... – beroe

+0

這就是我在嘗試上面的代碼時所得到的TypeError:只能加入一個迭代器 – Lily