2016-07-29 61 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

相关问题