我正在尝试从文件位置列表中获取文件名。认为它涉及字符串切片。
我制定的那个是:
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:获取文件名的更好方法是什么?
感谢。
答案 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 answer的raw()
一旦我们有了这个功能,我们就可以很好地操纵琴弦了
我已使用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']