python - 将 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..
非常欢迎任何朝着正确方向提出的想法和推动!
解决方案
这看起来很有希望;你已经完成了大部分工作。
我会做的是
- 将所有 CSV 文件名收集到一个列表中。因此,不要打印文件名,而是在循环之前创建一个空列表 (
csvfiles=[]
)并执行类似.os.walk()
csvfiles.append(os.path.join(r, file))
- 然后,遍历这些文件名,将每个文件名传递给当前用于读取
test.txt
. 如果你把它放在一个函数中,它可能看起来像这样:
def get_csv_headers(filename):
with open(filename, newline="") as f:
reader = csv.reader(f)
return next(reader)
- 现在,您可以将拆分文件名写入新文件并添加标题。我有点质疑你的文件格式 - 为什么用制表符分隔行的一部分,而用空格(和引号)分隔其余部分?如果你坚持这样做,你可以使用类似的东西
output.write("\t".join(filename.split("\\"))
output.write("\t")
output.write(" ".join(['"{}"'.format(header) for header in get_csv_headers(filename)])
但您可能需要重新考虑这种方法。像 JSON 这样的标准格式可能更具可读性和可移植性。
推荐阅读
- windows - PowerShell:为已启动的应用程序池运行 Start-WebAppPool 会导致问题吗?
- javascript - React:使用出生日期输入作为死亡日期的最小值
- reactjs - 在 Material-UI 的自动完成中使用“use-places-autocomplete”钩子?
- r - 使用 fable.prophet 时的超参数优化?
- c - 是否可以在 C 中将指针分配给数组或将数组的地址更改为指针地址?
- python - 使用 stdin.read() 从控制台读取值时出现问题
- linux - 作为指定用户从另一个内部调用一个 bash 函数
- typescript - nuxt 将变量分配给这个
- javascript - 无法读取未定义的属性“insertOnMatch”-TypeScript
- python - 更新 mongodb 集合中的列