我有一个包含60个文件夹的文件夹,每个文件夹包含大约60个CSV(以及1或2个非CSV)。
我需要比较所有这些CSV的标题行,因此我试图遍历目录并将以下内容写入输出CSV:(1)有关文件的文件路径和(2)输出CSV中该行的后续单元格。
然后转到下一个文件,并将相同的信息写入输出CSV的下一行。
我在将标头行写入CSV的过程中迷失了方向-而且迷失了方向,甚至没有生成错误消息。
有人可以建议下一步做什么吗?
@DirtiesContext
答案 0 :(得分:1)
您似乎对正在读取和写入的文件感到困惑。当您尝试在一项大功能中完成所有工作时,混乱是正常的。功能的全部目的是分解事物,以便易于跟踪,理解和调试。
这是一些无效的代码,但是您可以轻松打印出每个函数返回的内容,一旦知道是正确的,就将其提供给下一个函数。每个函数很小,变量很少,所以不会出错。
最重要的是,每个函数中的变量都是局部变量,这意味着它们不能干扰其他地方发生的事情,甚至不能使您认为它们可能在干扰(并且有很大的不同)。
def collect_csv_data():
results = []
for root, dirs, files in os.walk(args):
for file in files:
if file.endswith('.csv'):
headers = extract_headers(os.path.join(root, file))
results.append((file, headers))
return results
def extract_headers(filepath):
with open(filepath) as f:
reader = csv.reader(f)
headers = reader.next()
return headers
def write_results(result, filepath):
with open(filepath, 'w') as f:
writer = csv.writer(f)
for result in results:
writer.writerow(result)
if __name__ == '__main__':
directory = sys.argv[1]
results = collect_csv_data(directory)
write_results(results, 'results.csv')
答案 1 :(得分:1)
IIUC,您需要一个新的带有两列的csv文件:file_path和headers。
如果您需要的标头只是该csv中的列名列表,那么如果您先使用pandas
数据框来存储这些值,然后再将该数据框写入csv,则会更容易。
import pandas as pd
res = []
for root, dirs, files in os.walk(args):
for item in files:
# Check if the item is a CSV
if item.endswith('.csv'):
# If yes, read the first row
df = pd.read_csv(item)
row = {}
row['file_path'] = os.path.realpath(item)
row['headers'] = df.columns
res.append(row)
res_df = pd.DataFrame(res)
res_df.to_csv(csvfile)