gpt4 book ai didi

python - 如何将新列表附加到现有 CSV 文件?

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:24 26 4
gpt4 key购买 nike

我已经使用 CSV 编写器从列表创建了 CSV 文件。我想将通过 for 循环按列创建的另一个列表附加到 CSV 文件。

创建 CSV 文件的第一个代码如下:

with open("output.csv", "wb") as f:
writer = csv.writer(f)
for row in zip(master_lst):
writer.writerow(row)

我使用列表 master_lst 创建了 CSV 文件,输出如下:

read
ACACCUGGGCUCUCCGGGUACC
ACGGCUACCUUCACUGCCACCC
AGGCAGUGUGGUUAGCUGGUUG

然后,我通过 for 循环创建另一个列表 (ind_lst),并且该列表的内容必须按列附加到上一步中创建的 CSV 文件中。我使用了以下代码:

with open("output.csv", "ab") as f:
writer = csv.writer(f)
for row in zip(ind_lst):
writer.writerow(row)

我得到的输出如下:

read
ACACCUGGGCUCUCCGGGUACC
ACGGCUACCUUCACUGCCACCC
AGGCAGUGUGGUUAGCUGGUUG
sample1
3
3
1
sample2
4
4
1

但是我需要按列输出,如下所示:

read                         sample1     sample2
ACACCUGGGCUCUCCGGGUACC 3 4
ACGGCUACCUUCACUGCCACCC 3 4
AGGCAGUGUGGUUAGCUGGUUG 1 1

我检查了解决方案,但我只能找到按行附加的解决方案,但我需要按列附加它:append new row to old csv file python

我使用writer.writerows而不是writer.writerow,但我收到此错误:

_csv.Error: sequence expected

输出如下:

read
ACACCUGGGCUCUCCGGGUACC
ACGGCUACCUUCACUGCCACCC
AGGCAGUGUGGUUAGCUGGUUG
s a m p l e 1

正如您所看到的,它打印每个单元格中列表的第一个元素,然后因错误而终止。我是 python 的初学者,所以如果有人可以帮助解决这个问题,那就太棒了。

编辑:

master_lst 是使用以下代码创建的:

 infile= open(sys.argv[1], "r")
lines = infile.readlines()[1:]
master_lst = ["read"]
for line in lines:
line= line.strip().split(',')
fourth_field = line [3]
master_lst.append(fourth_field)

ind_lst 是使用以下代码创建的:

for file in files:
ind_lst = []
if file.endswith('.fa'):
first = file.split(".")
first_field = first [0]
ind_lst.append(first_field)
fasta= open(file)
individual_dict= {}
for line in fasta:
line= line.strip()
if line == '':
continue
if line.startswith('>'):
header = line.lstrip('>')
individual_dict[header]= ''
else:
individual_dict[header] += line
for i in master_lst[1:]:
a = 0
if key in individual_dict.keys():
a = individual_dict[key]
else:
a = 0
ind_lst.append(a)

最佳答案

您实际上正在尝试将多个列追加到现有文件中,即使这些新列的数据全部存储在一个列表中。最好以不同的方式排列 ind_lst 中的数据。但由于您尚未展示这是如何完成的,因此下面的代码适用于您问题中的格式。

由于修改 CSV 文件很棘手(因为它们实际上只是文本文件),因此只需使用合并的数据创建一个新文件,然后重命名该文件以匹配该文件,就会容易得多 删除原始内容后恢复原始内容(现已警告您)。

import csv
from itertools import izip # Python 2
import os
import tempfile

master_lst = [
'read',
'ACACCUGGGCUCUCCGGGUACC',
'ACGGCUACCUUCACUGCCACCC',
'AGGCAGUGUGGUUAGCUGGUUG'
]

ind_lst = [
'sample1',
'3',
'3',
'1',
'sample2',
'4',
'4',
'1'
]

csv_filename = 'output.csv'

def grouper(n, iterable):
's -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ...'
return izip(*[iter(iterable)]*n)

# first create file to update
with open(csv_filename, 'wb') as f:
writer = csv.writer(f)
writer.writerows(((row,) for row in master_lst))

# Rearrange ind_lst so it's a list of pairs of values.
# The number of resulting pairs should be equal to length of the master_lst.
# Result for example data: [('sample1', 'sample2'), ('3', '4'), ('3', '4'), ('1', '1')]
new_cols = (zip(*grouper(len(master_lst), ind_lst)))
assert len(new_cols) == len(master_lst)

with open(csv_filename, 'rb') as fin, tempfile.NamedTemporaryFile('r+b') as temp_file:
reader = csv.reader(fin)
writer = csv.writer(temp_file)
nc = iter(new_cols)
for row in reader:
row.extend(next(nc)) # add new columns to each row
writer.writerow(row)
else: # for loop completed, replace original file with temp file
fin.close()
os.remove(csv_filename)
temp_file.flush() # flush the internal file buffer
os.fsync(temp_file.fileno()) # force writing of all data in temp file to disk
os.rename(temp_file.name, csv_filename)

print('done')

创建后更新的文件内容:

read,sample1,sample2
ACACCUGGGCUCUCCGGGUACC,3,4
ACGGCUACCUUCACUGCCACCC,3,4
AGGCAGUGUGGUUAGCUGGUUG,1,1

关于python - 如何将新列表附加到现有 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com