在python中使用csv中多个同名列提取key_值
我有以下csv格式的数据: 我使用以下代码提取键值对并查看输出: 但是,我得到的输出与csv文件相同 进程已完成,退出代码为0 但我需要这样的输出: 请帮忙 根据您的方便,以下是csv数据和代码: CSV数据 ===================================在python中使用csv中多个同名列提取key_值,python,Python,我有以下csv格式的数据: 我使用以下代码提取键值对并查看输出: 但是,我得到的输出与csv文件相同 进程已完成,退出代码为0 但我需要这样的输出: 请帮忙 根据您的方便,以下是csv数据和代码: CSV数据 =================================== A,B,C,D,A,C,D 1,2,1,4,,, ,4,,6,9,8, 13,12,,,,19,84 import csv with open('sample.csv', 'r') as csv_file:
A,B,C,D,A,C,D
1,2,1,4,,,
,4,,6,9,8,
13,12,,,,19,84
import csv
with open('sample.csv', 'r') as csv_file:
reader = csv.reader(csv_file)
for row in reader:
print(row)
Python代码:
====================================
A,B,C,D,A,C,D
1,2,1,4,,,
,4,,6,9,8,
13,12,,,,19,84
import csv
with open('sample.csv', 'r') as csv_file:
reader = csv.reader(csv_file)
for row in reader:
print(row)
正如我在评论中所说的,您需要自己解析它
import csv
# fieldnames = ('A', 'B', 'C', 'D')
with open('sample.csv', 'r') as csv_file, open('output.csv', 'w', newline='') as out_file:
reader = csv.reader(csv_file)
header = next(reader)
fieldnames = list({key:None for key in header}) # create from first row
wrtr = csv.DictWriter(out_file, fieldnames=fieldnames)
wrtr.writeheader()
for row in reader:
data = {key:value for key, value in zip(header, row) if value}
wrtr.writerow(data)
output.csv
A,B,C,D
1,2,1,4
9,4,8,6
13,12,19,84
以防万一。详细的解决方案,而不是出于教育目的:
csv = '''A,B,C,D,A,C,D
1,2,1,4,,,
,4,,6,9,8,
13,12,,,,19,84'''
# parse csv
data = [cell.split(',') for cell in csv.splitlines()]
letters = data[0] # first line -- letters
body = data[1:] # rest lines
# make a dict {'A':[], 'B': [], 'C': [], 'D':[]}
dic = {}
for letter in letters:
if letter not in dic: dic[letter] = []
# fill the dict with lists of numbers {'A':[[...],[...]], 'B':[...], ...}
for i, letter in enumerate(letters):
dic[letter].append([line[i] for line in body])
# function takes nested lists [['a','']['','b']]
# and returns a list with non-empty values from the rest nested lists ['a','b']
def get_list_with_non_empty_values(lists):
if len(lists) == 1: return lists[0]
for lst in lists[1:]:
for i, cell in enumerate(lst):
if cell: lists[0][i] = cell # if the cell is non empty take it
return lists[0]
# loop through the dict and apply the function
for letter in dic:
dic[letter] = get_list_with_non_empty_values(dic[letter])
# turn the dict back into a table
data = [[cell for cell in dic]]
for i in range(len(dic)-1):
data.append([dic[letter][i] for letter in dic])
print(data)
输出:
[[ 'A', 'B', 'C', 'D' ],
[ '1', '2', '1', '4' ],
[ '9', '4', '8', '6' ],
[ '13', '12', '19', '84' ]]
我又为这种情况编写了一个代码。请参阅下面的代码。它通过在命令行中以文件名的形式传递参数(如 python脚本_name.py sample.csv:
import csv , sys
from datetime import datetime
InputFile=sys.argv[1]
print (InputFile)
now = datetime.now()
OS=str(now )+ ' : Processing file - ' + InputFile
print(OS)
LC=0
OutputFile= InputFile+'.done'
I= open(InputFile)
csv_f = csv.reader(I)
O=open(OutputFile,'w')
def listToString(s):
# initialize an empty string
str1 = ""
e=0
# traverse in the string
for ele in s:
if e==0:
str1 += ele
e+=1
else:
str1 += ','+ele
e+=1
# return string
return str1+'\n'
for row in csv_f:
if LC==0:
HEADER=row
#print (HEADER)
uheads = list(dict.fromkeys(HEADER))
#print(uheads)
#print(listToString(uheads))
STR=listToString(uheads)
O.write(STR)
LC=LC+1
#print(uheads)
else:
#print (row)
ROWS=row
while '' in ROWS:
ROWS.remove('')
#print(listToString(ROWS))
STR=listToString(ROWS)
O.write(STR )
LC=LC+1
I.close()
O.close()
在这种情况下,您不能使用DictReader,因为键不是唯一的,并且在创建每行的dict时,最后看到的赢,例如,第一个键
'A'
的值为1,但随后更新为值'
。对于C
和D
键也是如此。您需要自己解析。如果您提供示例输入和预期输出以及额外细节(如键的顺序等),这会有所帮助。您编辑了您声称得到的输出,但现在它与您的代码片段不匹配。对不起,Buran,但我不熟悉堆栈溢出,因此上传了错误的输出。你现在可以看到我的要求了。提前谢谢!如果你复制粘贴代码和数据的文本,而不是图片,那会更好。谢谢Buran,你的代码帮了我很多。此外,我扩展了这段代码,并将自动字段名加载到csv文件中,而不是手动声明它。导入csv#fieldnames=('A'、'B'、'C'、'D'、'E')reader=csv.DictReader(open('sample.csv'))header_all=reader.fieldnames used=set()fieldnames=[x代表x,如果x未使用,则全部使用;如果使用csv.DictReader
,则打印(fieldnames),而不是csv.reader
来读取输入文件,这将使您回到开始编辑问题之前的最初位置。我编辑了我的答案,从输入文件的第一行自动创建字段名
。