将文本文件提取到python中的多列
我有不同的文本文件,我想从那里提取值到一个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
你可以用字典来做到这一点,其中的关键将是“头”你想使用的值是一个列表。
因此,它看起来像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
对于这个解决方案,你可以确定只有两个键,所以你可以用这两个键和一个空的值列表构建字典 - 然后你可以摆脱'''if/else''为字典赋值。或者,如果您事先不确定密钥,可以使用['''collections.defaultdict'''](https://docs.python.org/3/library/collections.html#collections.defaultdict)。 – wwii
当您在代码中分割文本并计划使用单个项目时,最好给它们起个名字 - 这使得后续代码更易于阅读。利用解包:在这种情况下 - '''key,value = line.split(':'); value = value.strip()''' – wwii
这两个很好的例子。首先,我可能会保持它的方式,以便在将来无需修改代码即可更改文件格式。我同意你的第二个例子。 – Michael
这是我怎么可能做到这一点。假设所有文件中的字段都是相同的。制作名称列表,以及使用这些字段名称作为关键字的字典以及值列表作为条目。而不是在file1.text
,file2.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
你试图使用的元组? –
最后一列来自期望输出的位置?每个输入文件中只有两行? – wwii
我假设输入文件看起来像: 主要成本:30 额外费用:5 主要成本:40 额外费用:10个 – Michael