Python 将CSV文件数据合并到一个CSV文件
我有csv文件分布在多个目录中,每个csv文件只有一列包含数据。我要做的是读取所有这些文件,并将每个文件的列放入csv文件中。最终的csv文件将包含以文件名作为其标题的列,以及来自其原始文件的相应数据作为其列数据 这是我在Python 将CSV文件数据合并到一个CSV文件,python,csv,os.walk,Python,Csv,Os.walk,我有csv文件分布在多个目录中,每个csv文件只有一列包含数据。我要做的是读取所有这些文件,并将每个文件的列放入csv文件中。最终的csv文件将包含以文件名作为其标题的列,以及来自其原始文件的相应数据作为其列数据 这是我在~/csv\u files/ls ab arc bat-smg bn cdo crh diq es fo gd haw ia iu ki ksh lez lv mo na no os p
~/csv\u 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()
我的问题是:
您未正确使用os.walk()
函数的作用是:生成一个三元组(dirpath、dirname、filename)。“dirpath”是当前行走目录的路径,“dirnames”是“dirpath”中的目录列表,“filenames”是“dirpath”中的文件列表。“dirpath”可能是此处的“path”,以及“path”的任何子文件夹。您使用的os.walk()不正确
函数的作用是:生成一个三元组(dirpath、dirname、filename)。“dirpath”是当前行走目录的路径,“dirnames”是“dirpath”中的目录列表,“filenames”是“dirpath”中的文件列表。“dirpath”可能是这里的“path”,以及“path”的任何子文件夹。我不知道我是否理解你的意思。假设您有多个文件夹,例如“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
上面的代码应该可以工作,如果我是对的,我不知道我是否理解你的意思。假设您有多个文件夹,例如“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
如果我是对的,上面的代码应该可以工作,添加
print csv_path
到最里面的for
循环以确保路径是你期望的。walk()将print csv_path
添加到最里面的for
循环以确保路径是你期望的。walk()太棒了!谢谢,当我在新文件中写入此文件时,如何访问目录名?我希望目录名为列标题,较长的目录名为“root”。如果只需要最后一个目录名,请使用os.path.basename(root)。很高兴看到我的代码有帮助!刚刚更新了问题,以便对最终csv有一个清晰的概念。谢谢,@Null假设只需尝试name+os.path.basename(root)即可!谢谢,当我在新文件中写入此文件时,如何访问目录名?我希望目录名为列标题,较长的目录名为“root”。如果只需要最后一个目录名,请使用os.path.basename(root)。很高兴看到我的代码有帮助!刚刚更新了问题,以便对最终csv有一个清晰的概念。谢谢,@Null假设只要亲自尝试name+os.path.basename(root),我认为第二次os.walk没有用。独立于操作系统,OS.path.join比“/”好。我同意joinos.path.join比“/”好。但是,第二个os.walk是必需的。第一个os.walk获取所有子目录。当您迭代每个子目录时,您将需要第二个os.walk来查找该子目录下的文件。我的意思是,这种方法本身不是最优的,但我想这个想法是正确的。就我个人而言,我认为第二次os.walk是无用的。独立于操作系统,OS.path.join比“/”好。我同意joinos.path.join比“/”好。但是,第二个os.walk是必需的。第一个os.walk获取所有子目录。当您迭代每个子目录时,您将需要第二个os.walk来查找该子目录下的文件。我的意思是,这种方法本身并不是最优的,但我想这个想法是正确的。
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