将输出导入CSV文件

时间:2015-07-11 23:49:54

标签: python

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分别是这些文件的行数。

3 个答案:

答案 0 :(得分:1)

writerows采用可迭代的行代表迭代。您将它传递给一行,因此它将每列的每个字符解释为一个单元格。你不希望这样。使用writerow而不是writerows

答案 1 :(得分:1)

我看到了很多问题:

  • 您应该在for循环之前只打开一次csv文件。在for循环中打开它将覆盖先前循环迭代中的信息
  • icktoofay 指出您应该使用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()