2

我的 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()
4

3 回答 3

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

于 2011-10-10T20:37:00.093 回答
0

引用python文档:

如果 csvfile 是文件对象,则必须在不同的平台上使用 'b' 标志打开它。

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

于 2011-10-10T19:17:53.160 回答
0

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

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

于 2011-10-10T20:41:52.827 回答