簡體   English   中英

如何將新列表附加到現有的 CSV 文件?

[英]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)

您需要將readsample1sample2的數據組合成一行。

假設這些是可迭代的,您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM