[英]How to append a new list to an existing CSV file?
我已經使用 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
我檢查了解決方案,但我只能找到按行追加的解決方案,但我需要按列追加: 將新行追加到舊的 csv 文件 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)
您需要將read
、 sample1
和sample2
的數據組合成一行。
假設這些是可迭代的,您可以使用zip
將它們組合起來:
for row in zip(read, sample1, sample2):
writer.writerow(row)
您實際上是在嘗試將幾列附加到現有文件中,即使這些新列的數據都存儲在一個列表中。 最好以不同的方式排列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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.