我将csv文件分布在多个目录中,每个csv文件只有一个包含数据的列。我想要做的是读取所有这些文件并将每个文件的列放入csv文件中。最终的csv文件将包含带有文件名作为其标题的列,以及来自其原始文件的相应数据作为其列数据。
这是~/csv_files/ ls
ab arc bat-smg bn cdo crh diq es fo gd haw ia iu ki ksh lez lv mo na no os pih rmy sah simple ss tet tr ur war zea
ace arz bcl bo ce cs dsb et fr gl he id ja kk ku lg map-bms mr nah nov pa pl rn sc sk st tg ts uz wo zh
af as
每个目录都有两个csv文件,我想过使用os.walk()函数,但我认为我对os.walk的理解是不正确的,这就是为什么我目前所拥有的并没有产生任何东西。
import sys, os
import csv
root_path = os.path.expanduser(
'~/data/missing_files')
def combine_csv_files(path):
for root, dirs, files in os.walk(path):
for dir in dirs:
for name in files:
if name.endswith(".csv"):
csv_path = os.path.expanduser(root_path + name)
if os.path.exists(csv_path):
try:
with open(csv_path, 'rb') as f:
t = f.read().splitlines()
print t
except IOError, e:
print e
def main():
combine_csv_files(root_path)
if __name__=="__main__":
main()
我的问题是:
最后我试图获得这样的csv文件,(这是潜在的标题)
ab_csv_data_file1, ab_csv_data_file2, arc_csv_data_file1, arc_csv_data_file2
答案 0 :(得分:2)
您错误地使用了os.walk()
def combine_csv_files(path):
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(".csv"):
csv_path = os.path.join(root, name)
try:
with open(csv_path, 'rb') as f:
t = f.read().splitlines()
print t
except IOError, e:
print e
os.walk()函数产生一个3元组(dirpath,dirnames,filenames)。 “dirpath”是当前行走目录的路径,“dirnames”是“dirpath”中的目录列表,“filenames”是“dirpath”中的文件列表。 “dirpath”可能是这里的“路径”,也可能是“path”的任何子文件夹。
答案 1 :(得分:1)
我不知道我是否明白你的意思。让我们有多个文件夹,例如“ab”,“arc”等。对于每个文件夹,它包含两个CSV文件。
如果我是对的,那么你就没有做正确的事。
def combine_csv_files(path):
for root, dirs, files in os.walk(path):
for dir in dirs:
for dirpath, sub_dirs, sub_files in os.walk('/'.join([path,dir])
for name in sub_files:
if name.endswith(".csv"):
csv_path = os.path.expanduser(dirpath + name)
if os.path.exists(csv_path):
try:
with open(csv_path, 'rb') as f:
t = f.read().splitlines()
print t
except IOError, e:
print e
如果我是对的,上面的代码应该有用