python - 在 Python 中用子文件夹的名称填充列?
问题描述
我写了这个关于熊猫的问题,因为它是一个更流行的模块,以理解一个类似的例子。
我想添加一列并用目录中每个文件的唯一地址部分填充它:
示例:假设我从每个名为的子文件夹中有两个文件:45554
因此32456
它们的路径如下:
C:\Users\user\Desktop\SHAPE\45554\INS\INS.shp
C:\Users\user\Desktop\SHAPE\45554\INB\INB.shp
C:\Users\user\Desktop\SHAPE\32456\INS\INS.shp
C:\Users\user\Desktop\SHAPE\32456\INB\INB.shp
所以我需要提取每一行-3
的位置并填充新列。
喜欢:
new_col
45554
45554
32456
32456
etc..
编码:
import pandas as pd
import os
import glob
folder = path.Path(r"C:\Users\user\Desktop\SHAPE")
files = []
for fil in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True):
try:
files.append(pd.read_table(fil))
fil['col'] = shpfile.split("\\")[-3]
except ValueError as ex:
if not os.listdir(fil):
print(f'{fil} is empty')
df = pd.concat(files, sort=True))
df.to_csv(folder / 'all.csv')
怎样才能实现?
解决方案
您可以使用该os
模块来执行此操作。使用此模块的好处是将为您的平台使用正确的分隔符。
import os
x = r'C:\Users\user\Desktop\SHAPE\45554\INS\INS.shp'
def get_folder(fp, k=5):
return os.path.split(fp)[0].split(os.sep)[k]
x_folder = get_folder(x) # '45554'
然后只需通过以下方式在您的循环中应用pd.DataFrame.assign
:
for fil in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True):
files.append(pd.read_table(fil).assign(col=get_folder(fil)))
推荐阅读
- linux-kernel - 内核恐慌未同步尝试终止初始化退出代码 0x0000000b
- python - 为什么用户仍然可以在密码中输入 umgc 并且它不会返回为假?
- github - 当目录不存在时,如何停止/取消带有错误消息的工作流?
- python-3.x - 检索集成在 httptrigger/queuetrigger -Python 中的 Keyvault Secret
- c++ - 将 QString 写入 Excel 会产生额外的选项卡吗?
- npm - 当构建成功运行“下一个构建”时,AWS CodeBuild 不产生任何工件
- reactjs - 你如何在 react redux 中将动作拆分为多个动作?
- amazon-web-services - Lambda 上的秘密文件
- git - 在不覆盖工作(签出)版本的情况下获取文件的 --ours 和 --theirs 版本的最简单方法是什么?
- java - 无法在 android studio 上使用 File.delete() 获取要删除的下载目录中的文件