在python中将文本文件提取到多个列中

时间:2016-07-29 21:47:53

标签: python csv extract multiple-columns

我有不同的文本文件,我想从那里将​​值提取到csv文件中。 每个文件都具有以下格式

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

2 个答案:

答案 0 :(得分:2)

您可以使用字典来执行此操作,其中键将是"标题"你想使用,价值是一个列表。

所以它看起来像ListOfStrings[1] = "test";

edit2:走在前面,清理了这个答案,让它更有意义。

您可以构建字典并对其进行迭代:

someDict = {'main cost': [30,40], 'additional cost': [5,10]}

代码输出:

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)

修改示例以适合您想要的输出应该非常简单。

我使用了示例@ append multiple values for one key in Python dictionary并感谢@wwii提供了一些建议。

我使用OrderedDict,因为字典不会保持按键有序。

您可以运行我的示例@ https://ideone.com/myN2ge

答案 1 :(得分: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