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