f = glob.glob('/fulldirectory/*.txt')
for index, files in enumerate(f, 1):
r = open(files)
reader = csv.DictReader(r)
所以我试图在我的分析中打印出文件的实际名称。
上面目录中的每个文件都使用以下约定命名:R1.txt,R2.txt,R3.txt等。
目前我只是使用枚举函数来打印数字 - 但这只能在假设目录中没有文件丢失的情况下工作。
编辑:
我尝试了这个,但它没有给我我想要的东西:
p = [int(s) for s in files if files.isdigit()]
print p
>[0,1]
>[0,2]
答案 0 :(得分:0)
您只需执行一个简单的re.sub
即可将.txt
替换为空字符串。
import re, glob
f = glob.glob('/fulldirectory/*.txt')
for file in f:
print(re.sub('\.txt$', '', file))
r = open(file)
reader = csv.DictReader(r)
在理想的世界中,我会打印索引',并且在第一次迭代时,将打印R01。然后R02等
如果您希望它们始终处于有序状态,请执行此操作,先对文件名进行排序:
f = sorted(glob.glob('/fulldirectory/*.txt'))
如果您只想打印文件的基本名称,可以改为打印:
import os
print(re.sub('\.txt$', '', os.path.basename(file)))
注意:建议的其他方式可能不太安全,因为不建议在文件名上使用多个拆分。
这是一个完整的例子,其中包含OP要求的正确解释:
import re, os, glob
file_list = glob.glob('/fulldirectory/*.txt') # get the list of file names that ends in .txt
f = sorted(file_list, key = lambda x: int(re.findall('\d+\.txt$',os.path.basename(x))[0]))
# 1 2 3 8 4 5 6 7
for file in f:
print(re.sub('\.txt$', '', file))
# 9
# do your stuff....
sorted()
函数用于对文件名列表进行排序,然后将其存储到f(f是file_list的排序版本)
key
参数是一个接受参数并输出可排序对象的函数(即str
,int
,list
...),它用于定义用
lambda是一个接受参数' x'的匿名函数,其工作方式与def NoName(x): return something
使用re.findall
查找与正则表达式匹配的所有子字符串,在这种情况下,只有一个匹配[即。 'abc123.txt'
将返回[123]
]
'\d+\.txt$'
是正则表达式,\d+
- 任何重复一次或多次的数字,\.
是常规点.
theres a \
在前面,因为通常在正则表达式中,.
具有代表任何字符的特殊含义,\
将其转义,使其仅为常规.
,txt
是要在该给定位置匹配的字符串,$
是表示仅匹配字符串的 end 的符号。
os.path.basename()
用于检索基本名称(路径的最后部分[即'abc123.txt'
的{{1}}])
由于'\a\b\c\abc123.txt'
始终返回一个列表,因此检索唯一匹配将涉及使用[0](即。re.findall()
=> ['123',][0]
)
因为检索的数据是字符串,必须使用int()将其更改为'123'
进行比较。 int是传递给#2中int
的内容。
key
第一个参数是正则表达式,第二个参数是要替换它的字符串,第三个参数是需要替换的字符串(即。re.sub('\.txt$', '', file)
=> { {1}}因为它无法替换每个re.sub('a', '', 'banana')
)检查#5以获取有关正则表达式的更多信息
如果您需要进一步澄清,请告诉我
其他替代方法是:
bnn
有用的链接:
https://docs.python.org/3/library/re.html
答案 1 :(得分:0)
就这样:
f = glob.glob('/fulldirectory/*.txt')
for files in f:
print files.split('\\')[-1].split('.')[0]