我的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()
答案 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并修复你遇到的任何错误。