Python,csv writer之后的空文件..再次

时间:2011-10-10 19:01:02

标签: python csv writer

我的python程序遍历一堆csv文件,读取它们,并将文件中的特定列写入另一个csv文件。当程序运行时,我可以看到文件以正确的方式写入,但是一旦程序完成,我刚写的所有文件都会变空。

所有其他类似线程的解决方案似乎正在关闭您正确写入的文件,但我似乎无法弄清楚我做错了什么。任何人吗?

import os
import csv

def ensure_dir(f):
    d = os.path.dirname(f)
    if not os.path.exists(d):
        os.makedirs(d)

readpath = os.path.join("d:\\", "project")
savepath=os.path.join("d:\\", "save")
ensure_dir(savepath)
contents_1=os.listdir(readpath)
for i in contents_1[1:len(contents_1)]:
    readpath_2=os.path.join(readpath, i)
    if os.path.isdir(readpath_2)== True :
        contents_2=os.listdir(readpath_2)
        for i in contents_2:
            readpath_3=os.path.join(readpath_2, i)
            if os.path.isfile(readpath_3)== True :
                savefile=savepath + "\\" + i
                savefile = open(savefile, 'wb')
                writer = csv.writer(savefile, delimiter=';')
                readfile=open(readpath_3, 'rb')
                reader = csv.reader(readfile, delimiter=';')
                try:
                    for row in reader:
                        writer.writerow([row[0], row[3]])
                except:
                    print(i)
                finally:
                    savefile.close()
                    readfile.close()

3 个答案:

答案 0 :(得分:2)

savefile=savepath + "\\" + i是错误。如果"d:\\project\a\x.csv""d:\\project\b\x.csv"都存在,那么您将不止一次写入savepath + "\\" + i。如果第二个路径为空"x.csv",那么它将用空文件覆盖结果。

请改为尝试:

import os
import csv

def ensure_dir(f):
    d = os.path.dirname(f)
    if not os.path.exists(d):
        os.makedirs(d)

readpath = os.path.join("d:\\", "project")
savepath = os.path.join("d:\\", "save")

ensure_dir(savepath)

for dname in os.listdir(readpath)[1:]:
    readpath_2 = os.path.join(dname, fname)
    if not os.path.isdir(readpath_2):
        continue
    for fname in os.listdir(readpath_2)
        fullfname = os.path.join(readpath_2, fname)
        if not os.path.isfile(fullfname):
            continue
        savefile = open(savepath + "\\" + dname + "_" + fname, wb)
        writer = csv.writer(savefile, delimiter=';')
        readfile=open(fullfname, 'rb')
        reader = csv.reader(readfile, delimiter=';')
        try:
            for row in reader:
                writer.writerow([row[0], row[3]])
        except:
            print(i)
        finally:
            savefile.close()
            readfile.close()

使用os.walk

可以大大改善此代码

答案 1 :(得分:0)

引用python文档:

  

如果csvfile是一个文件对象,那么它必须在平台上以“b”标志打开,这会产生影响。

将'w'和'r'标志更改为'wb'和'rb'。

答案 2 :(得分:0)

(1)你的外循环和你的内循环都使用i作为循环变量。这没有希望(a)被人类理解(b)正常工作。

(2)except: print(i) ......什么???我建议你删除try / except并修复你遇到的任何错误。