Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用csv中多个同名列提取key_值_Python - Fatal编程技术网

在python中使用csv中多个同名列提取key_值

在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:

我有以下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:
    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
来读取输入文件,这将使您回到开始编辑问题之前的最初位置。我编辑了我的答案,从输入文件的第一行自动创建
字段名