Desktop.zip包含多个文本文件。 fun.py是一个python程序,它将打印zip文本文件的名称以及每个文件中的行数。一切都还可以。但是,它还会将此输出导入单个CSV文件中。代码: -
import zipfile, csv
file = zipfile.ZipFile("Desktop.zip", "r")
inputcsv = input("Enter the name of the CSV file: ")
csvfile = open(inputcsv,'a')
#list file names
for name in file.namelist():
print (name)
# do stuff with the file object
for name in file.namelist():
with open(name) as fh:
count = 0
for line in fh:
count += 1
print ("File " + name + "line(s) count = " + str(count))
b = open(inputcsv, 'w')
a = csv.writer(b)
data = [name, str(count)]
a.writerows(data)
file.close()
我希望CSV文件中的输出如下: -
test1.txt, 25
test2.txt, 10
但是我在CSV文件中输出了这个输出: -
t,e,s,t,1,.,t,x,t
2,5
t,e,s,t,2,.,t,x,t
1,0
这里,test1.txt和test2.txt是Desktop.zip中的文件,25和10分别是这些文件的行数。
答案 0 :(得分:1)
writerows
采用可迭代的行代表迭代。您将它传递给一行,因此它将每列的每个字符解释为一个单元格。你不希望这样。使用writerow
而不是writerows
。
答案 1 :(得分:1)
我看到了很多问题:
writerow
,而不是writerows
file
是一个保留字,您不应该使用它来命名变量。此外,它不是那个描述性的这是我的方法:
import csv
import zipfile
with open('out.csv', 'wb') as file_handle:
csv_writer = csv.writer(file_handle)
archive = zipfile.ZipFile('Desktop.zip')
for filename in archive.namelist():
lines = archive.open(filename).read().splitlines()
line_count = len(lines)
csv_writer.writerow([filename, line_count])
我的方法有几个问题,可能会也可能不重要:
答案 2 :(得分:0)
正如其他人所指出的那样,您的问题中的代码存在多个问题。两个主要的原因是您正在为正在处理的每个归档成员反复重新创建csv文件,然后是destroy()
错误的数据。它将您要传递的列表中的每个项目解释为要添加到csv文件的单独行。
解决这个问题的一种方法是只打开csv文件一次,然后再进入csvwriter.writerows()
循环,该循环计算存档每个成员中的行,并在调用{时刻时写入一行{1}}。
稍微不同的方式(如下所示)确实使用了for
但传递了generator expression,它会一次性处理每个成员,而不是反复调用csvwriter.writerow()
。它还以递增方式处理每个成员,因此它不需要一次将整个内容读入内存,然后将其拆分以获得行数。
虽然你没有说明你正在使用的Python版本,但是从你问题的代码中我猜测它是Python 3.x,所以下面的答案有已经编写并经过测试(尽管在Python 2.7中使用它并不困难)。
writerows()
创建的csv文件中的内容示例格式:
writerow()