[英]Using CSV module to append multiple files while removing appended headers
我想使用Python CSV模塊打開要附加的CSV文件。 然后,從CSV文件列表中,我想讀取每個csv文件並將其寫入附加的CSV文件。 我的腳本工作得很好-除了無法找到一種方法來從所有讀取的第一個CSV文件中刪除標頭之外,我的腳本非常有用。 我確信我的else
代碼塊無法正確執行。 也許我的if else
代碼的語法有問題? 任何想法將不勝感激。
writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
for files in lstFiles:
readFile = open(input_file,'rU')
reader = csv.reader(readFile,dialect='excel')
for i in range(0,len(lstFiles)):
if i == 0:
oldHeader = readFile.readline()
newHeader = writeFile.write(oldHeader)
for row in reader:
writer.writerow(row)
else:
reader.next()
for row in reader:
row = readFile.readlines()
writer.writerow(row)
readFile.close()
writeFile.close()
您實際上對lstFiles進行了兩次迭代。 對於列表中的每個文件,您都在從0運行內部for循環。您需要以下內容:
writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
headers_needed = True
for input_file in lstFiles:
readFile = open(input_file,'rU')
reader = csv.reader(readFile,dialect='excel')
oldHeader = reader.next()
if headers_needed:
newHeader = writer.writerow(oldHeader)
headers_needed = False
for row in reader:
writer.writerow(row)
readFile.close()
writeFile.close()
您還可以在lstFiles上使用enumerate
來對包含迭代計數和文件名的元組進行迭代,但是我認為布爾值可以更清楚地顯示邏輯。
您可能不希望在csv閱讀器上混合迭代並直接在基礎文件上調用readline。
我認為您要迭代太多次(在各種事情上:文件列表和文件本身)。 您肯定有一些一致性問題; 由於我們看不到您的變量初始化,因此很難確定。 這就是我想要的:
with open(append_file,'a+b') as writeFile:
need_headers = True
for input_file in lstFiles:
with open(input_file,'rU') as readFile:
headers = readFile.readline()
if need_headers:
# Write the headers only if we need them
writeFile.write(headers)
need_headers = False
# Now write the rest of the input file.
for line in readFile:
writeFile.write(line)
我拿出了所有csv專用的東西,因為沒有理由將其用於此操作。 我還使用文件作為上下文管理器和命名良好的布爾值(而不是i == 0
的“魔術”),對代碼進行了相當大的整理,以使其易於遵循。 結果是一個更好的代碼塊(希望)不會讓您無所不用其極地了解正在發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.