首页 > 解决方案 > 将 csv 标头与相应的文件路径组合到新文件中

问题描述

我不确定如何“破解”下面的 Python-nut。所以我希望你们中一些更有经验的 Python 开发者能把我推向正确的方向。

我得到了什么: 包含许多 csv 文件的几个目录

例如:

/home/Date/Data1 /home/Date/Data2 /home/Date/Data3/sub1 /home/Date/Data3/sub2

我想要的: 一个包含每个文件的“拆分”路径的文件,后跟相应文件的变量(=row/headers)。像这样:

home /t Date /t Data1 /t "variable1" "variable2" "variable3" ...
home /t Date /t Data2 /t "variable1" "variable2" "variable3" ...
home /t Date /t Data3 /t sub1 /t  "variable1" "variable2" "variable3" ...
home /t Date /t Data3 /t sub2 /t  "variable1" "variable2" "variable3" ...

我现在在哪里?:第一步是弄清楚如何打印出单个 csv 文件的第一行(变量)(我使用 test.txt 文件进行测试)

# print out variables of a single file:
import csv
with open("test.txt") as f:
    reader = csv.reader(f)
    i = next(reader)

    print(i)

第二步是弄清楚如何在包含目录的子文件夹中打印 csv 文件的路径。这就是我的结尾:

import os

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
for r, d, f in os.walk(thisdir):
    for file in f:
        if ".csv" in file:
            print(os.path.join(r, file))

印刷:

/home/Date/Data1/file1.csv
/home/Date/Data1/file2.csv
/home/Date/Data2/file1.csv
/home/Date/Data2/file2.csv
/home/Date/Data2/file3.csv
/home/Date/Data3/sub1/file1.csv
/home/Date/Data3/sub2/file1.csv
/home/Date/Data3/sub2/file2.csv

我被困在哪里?:我正在努力弄清楚如何从这里出发,非常感谢任何朝着正确方向的想法、方法等!

干杯,B

##### 更新 #####

受到 Tim Pietzcker 有用评论的启发,我已经走了很长一段路(感谢 Tim!)。但我无法让 output.write & join 部分工作,因此代码略有不同。现在的新问题是将两个列表“合并”为两个单独的列,以逗号作为分隔符(我想创建一个 csv 文件)。既然我被卡住了,我又想看看这里有经验的python'ers有什么好的建议吗?

#!/usr/bin/python
import os
import csv
thisdir = os.getcwd()

# Extract file-paths and append them to "csvfiles"
for r, d, f in os.walk(thisdir):        # r=root, d=directories, f = files
    for file in f:
        if ".csv" in file:
            csvfiles.append(os.path.join(r, file))

# get each file-path on new line + convert to list of str
filepath = "\n".join(["".join(sub) for sub in csvfiles])
filepath = filepath.replace(".csv", "")  # remove .csv
filepath = filepath.replace("/", ",")    # replace / with ,

结果是:

,home,Date,Data1,file1
,home,Date,Data1,file2
,home,Date,Data1,file3
... and so on

然后到标题:

# Create header-extraction function:
def get_csv_headers(filename):
    with open(filename, newline='') as f:
        reader = csv.reader(f)
        return next(reader)

# Create empty list for headers
headers=[]

# Extract headers with the function and append them to "headers" list
for l in csvfiles:
    headers.append(get_csv_headers(l))

# Create file with headers
headers = "\n".join(["".join(sublst) for sublst in headers]) # new lines + str conversion
headers = headers.replace(";", ",") # replace ; with ,

结果是:

variable1,variable2,variable3
variable1,variable2,variable3,variable4,variable5,variable6
variable1,variable2,variable3,variable4
and so on..

我现在想要的:像这样的 csv:

home,Date,Data1,file1,variable1,variable2,variable3
home,Date,Data1,file2,variable1,variable2,variable3,variable4,variable5,variable6
home,Date,Data1,file3, variable1,variable2,variable3,variable4

例如:

with open('text.csv', 'w') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerows(zip(filepath,headers))

导致:

",",v
h,a
o,r
m,i,
e,a
and so on..

非常欢迎任何朝着正确方向提出的想法和推动!

标签: pythonparsing

解决方案


这看起来很有希望;你已经完成了大部分工作。

我会做的是

  1. 将所有 CSV 文件名收集到一个列表中。因此,不要打印文件名,而是在循环之前创建一个空列表 ( csvfiles=[])并执行类似.os.walk()csvfiles.append(os.path.join(r, file))
  2. 然后,遍历这些文件名,将每个文件名传递给当前用于读取test.txt. 如果你把它放在一个函数中,它可能看起来像这样:

def get_csv_headers(filename):
    with open(filename, newline="") as f:
        reader = csv.reader(f)
        return next(reader)
  1. 现在,您可以将拆分文件名写入新文件并添加标题。我有点质疑你的文件格式 - 为什么用制表符分隔行的一部分,而用空格(和引号)分隔其余部分?如果你坚持这样做,你可以使用类似的东西

output.write("\t".join(filename.split("\\"))
output.write("\t")
output.write(" ".join(['"{}"'.format(header) for header in get_csv_headers(filename)])

但您可能需要重新考虑这种方法。像 JSON 这样的标准格式可能更具可读性和可移植性。


推荐阅读