我想使用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()
答案 0 :(得分:1)
您有效地迭代lstFiles两次。对于列表中的每个文件,您将从0开始运行内部循环。您需要类似的内容:
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。
答案 1 :(得分:0)
我认为你的迭代次数太多了(在各种事情上:你的文件列表和文件本身)。你肯定有一些一致性问题;由于我们无法看到您的变量初始化,因此有点难以确定。这就是我想你想要的:
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特定的东西,因为没有理由将它用于此操作。我还大大清理了代码,使其更容易理解,使用文件作为上下文管理器和一个名为boolean而不是“magic”i == 0
检查。结果是一个更好的代码块(希望)不会让你跳过箍来理解发生了什么。