如何使用路径字符串的基本部分提取子字符串

时间:2014-08-16 21:41:56

标签: python string pandas os.path path-manipulation

关于字符串操作有几个问题,但是我无法找到允许我执行以下操作的答案 - 我认为应该很简单...

我有一个DataFrame,其中包含一个包含文件名和路径

的列

以下代表示例DataFrame:

index = ['1']
columns=['root']
df = pd.DataFrame(index=index,columns=columns)
path = 'C:\\folder1\\folder2\\folder3\\folder4\\filename.csv'
df['root']=path
df

Out[89]:
root
C:\folder1\folder2\folder3\folder4\filename.csv 
1 rows × 1 columns

我想最终只使用'文件名'字符串的一部分。有很多行,路径不是常数,所以我不能使用str.replace

我可以删除最右边的.csv'像这样的部分:

df['root'] = df['root'].str.rstrip('.csv')    
df


Out[90]:
root
C:\folder1\folder2\folder3\folder4\filename 
1 rows × 1 columns

- 但我无法制作任何有关删除字符串左侧路径部分的工作方法。

如何只返回'文件名'这个路径的一部分(字符串),假设路径的前面元素可以从记录改变为记录吗?

有人有建议吗?任何帮助非常感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用os.path中的实用程序来简化这一过程,即splitextbasename

>>> import os.path
>>> df["root"].apply(lambda x: os.path.splitext(os.path.basename(x))[0])
0    filename
Name: root, dtype: object

PS:rstrip并不像您认为的那样工作 - 它会删除那些字符,而不是子字符串。例如:

>>> "a11_vsc.csv".rstrip(".csv")
'a11_'

答案 1 :(得分:1)

假设路径中始终至少有一个深度,我们可以在斜杠上拆分,取最后一个元素,然后在其上调用rstrip:

In [9]:

df.root.str.split('\\').str[-1].str.rstrip('.csv')
Out[9]:
1    filename
Name: root, dtype: object

编辑根据DSM指出的有关rstrip的内容,您可以调用拆分两次:

In [11]:

df.root.str.split('\\').str[-1].str.split('.').str[0]
Out[11]:
1    filename
Name: root, dtype: object

答案 2 :(得分:1)

没有任何关于此的特定熊猫,它是os.path的基本路径处理。

第二,Windows/DOS has been accepting / as a path separator for at least 10-15 years now。所以你可以而且应该写mypath = 'C:/folder1/folder2/folder3/folder4/filename.csv' 正如您所注意到的,使用反斜杠会使您的字符串处理生活变得困难,因为它必须被转义,并导致更糟糕的代码。定义os.sep = r'\\'似乎无效。

import os
os.path.basename(r'C:/folder1/folder2/folder3/folder4/filename.csv')
'filename.csv'

现在,如果真的想要坚持在Python中编写特定于操作系统的代码(虽然根本没有理由这样做),你可以使用这个鲜为人知的平台-specficic version of os.path:

import ntpath  # Windows/DOS-specific versions of os.path
ntpath.basename(r'C:\folder1\folder2\folder3\folder4\filename.csv')
'filename.csv'

答案 3 :(得分:1)

对于最新的Python,建议使用pathlib。可以通过应用.stem来获得基本名称,如下所示。通常,DataFrames通常具有多行,因此下面的示例也使用熊猫.apply

import pathlib

df['root'].apply(lambda x: pathlib.Path(x).stem)
# Out[1]:
# 1    filename
# Name: root, dtype: object

如果要包含扩展名,可以通过应用.name来获取。

df['root'].apply(lambda x: pathlib.Path(x).name)
# Out[2]:
# 1    filename.csv
# Name: root, dtype: object