Python,字符串切片(从文件位置列表中获取文件名)

时间:2014-10-28 06:17:45

标签: python string

我正在尝试从文件位置列表中获取文件名。认为它涉及字符串切片。

我制定的那个是:

L = ['C:\\Design\dw\file4.doc',
'C:\\light\PDF\downloads\list.doc',
'C:\\Design\Dq\file4g.doc',
'C:\\Design\Dq\file4r.doc',
'C:\\Design\Dq\file4k.doc',
'C:\\Design\Dq\ole.doc',
'C:\\GE\easy\file\os_references(9).doc',
'C:\\mate\KLO\Market\BIZ\KP\who\Documents\REF.doc']

LL = []

for a in L:
    b = a.split('\')
    for c in b:
        if c.endswith('.doc'):
            c.replace('.doc', '')
            LL.append(c)

print LL

问题1:输出仍然包含'.doc'。为什么,如何删除它们?

问题2:获取文件名的更好方法是什么?

感谢。

6 个答案:

答案 0 :(得分:2)

第一个问题的答案是字符串是不可变的,.replace()不会修改字符串,即:

blaize@bolt ~ $ python 
>>> s = "foobar"
>>> s2 = s.replace("o", "x")
>>> print s
foobar
>>> print s2
fxxbar

我对第二个问题的回答如下:

# I use ntpath because I'm running on Linux.
# This way is more robust if you know you'll be dealing with Windows paths.
# An alternative is to import from os.path then linux filenames will work 
# in Linux and Windows paths will work in Windows.
from ntpath import basename, splitext

# Use r"" strings as people rightly point out.
# "\n" does not do what you think it might.
# See here: https://docs.python.org/2.0/ref/strings.html.
docs = [r'C:\Design\dw\file4.doc',
        r'C:\light\PDF\downloads\list.doc',
        r'C:\Design\Dq\file4g.doc',
        r'C:\Design\Dq\file4r.doc',
        r'C:\Design\Dq\file4k.doc',
        r'C:\Design\Dq\ole.doc',
        r'C:\Design/Dq/test1.doc',  # test a corner case
        r'\\some_unc_machine\Design/Dq/test2.doc',  # test a corner case
        r'C:\GE\easy\file\os_references(9).doc',
        r'C:\mate\KLO\Market\BIZ\KP\who\Documents\REF.doc']

# Please use meaningful variable names:
basenames = []

for doc_path in docs:

    # Please don't reinvent the wheel.
    # Use the builtin path handling functions.
    # File naming has a lot of exceptions and weird cases 
    # (particularly on Windows).
    file_name = basename(doc_path)
    file_basename, extension = splitext(file_name)
    if extension == ".doc":
        basenames.append(file_basename)

print basenames

祝你好运。 Python是一门优秀的语言。

答案 1 :(得分:0)

[file.split('\\')[-1].split('.')[0] for file in L]

你实际上没有在你的例子中做任何切片。你正在拆分和更换。由于我们知道文件名和扩展名将始终是路径的最后一部分,因此我们可以在拆分后使用负索引来访问它。

一旦我们再次拆分,文件名将永远是第0个元素,所以我们可以抓住它并将其添加到列表中。

编辑:我刚才注意到这个方法会遇到包含\f的路径的问题,因为这是一个特殊的Python角色。

答案 2 :(得分:0)

如果文件名

中没有空格或其他符号,请尝试此操作
[re.findall('\w+.doc$', L) for x in L]

试着看看

  

ntpath模块

答案 3 :(得分:0)

首先,replace方法返回带有替换值的字符串。它不会改变字符串。所以你需要做

c = c.replace('.doc', '')

答案 4 :(得分:0)

第一个答案:replace会返回一个字符串副本,因此您不会保存更改。
第二个答案:你需要获得几个路径的原始表示,因为'\f'之类的组合被解释为utf-8字符。
所以棘手的部分是将字符串格式化为其原始表示。为此,我使用了this answerraw() 一旦我们有了这个功能,我们就可以很好地操纵琴弦了 我已使用re.split接受unix和dos格式路径

>>> L = [re.split(r'[\/\\]', raw(path)) for path in L]
>>> L
[['C:', 'Design', 'dw', 'file4.doc'], ['C:', 'light', 'PDF', 'downloads', 'list.doc'], ['C:', 'Design', 'Dq', 'file4g.doc'], ['C:', 'Design', 'Dq', 'file4r.doc'], ['C:', 'Design', 'Dq', 'file4k.doc'], ['C:', 'Design', 'Dq', 'ole.doc'], ['C:', 'GE', 'easy', 'file', 'os_references(9).doc'], ['C:', 'mate', 'KLO', 'Market', 'BIZ', 'KP', 'who', 'Documents', 'REF.doc']]

现在L包含路径部分列表,因此您可以访问文件名及其扩展名,获取每个列表的最后一个元素

>>> L_names = [path_parts[-1] for path_parts in L if path_parts[-1].endswith('.doc')]
>>> L_names
['file4.doc', 'list.doc', 'file4g.doc', 'file4r.doc', 'file4k.doc', 'ole.doc', 'os_references(9).doc', 'REF.doc']

答案 5 :(得分:-3)

首要重点是您应该使用 raw 字符串(r前缀)输入您的列表:

L = [r'C:\\Design\dw\file4.doc',
     r'C:\\light\PDF\downloads\list.doc',
     …]

否则,在文件名中插入字符(\…通常由单个字符替换)。

Python 2有一个专门用于操作路径的子模块,它可以为您提供预期的结果:

from os.path import basename, splitext                                          
print [splitext(basename(path))[0] for path in L]

请注意,路径和此脚本必须在使用相同路径分隔符(/\)约定的系统上运行(通常应该是这种情况,因为路径通常在本地有意义机器)。您可以通过执行以下操作使其专门用于Windows路径(在任何操作系统上):

from ntpath import basename, splitext 

然后,你可以在任何机器上获得:

['file4', 'list', 'file4g', 'file4r', 'file4k', 'ole', 'os_references(9)', 'REF']