2017-04-16 30 views
1
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

你可以做一个简单的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.... 
  1. sorted()功能是用来排序的文件名列表,然后将其存储到F(f是排序版本file_list中)的

  2. key的说法是,接受一个参数,并输出可排序的对象(即strintlist ...),它是一个函数用来定义它与

  3. 拉姆达排序的关键是接受的说法“X”匿名函数,这个作品以同样的方式作为def NoName(x): return something

  4. 使用re.findall地发现,正则表达式匹配所有子中,这种情况下,应该只有一个匹配[即。'abc123.txt'将返回[123]]

  5. '\d+\.txt$'是一个正则表达式,\d+ - 任意数量的重复一次或多次,\.是一个规则的点.在前面那里有一个\因为通常在正则表达式,一个.具有它所代表的特殊含义任何字符,\转义它,使其只有一个规则.,txt是一个字符串匹配在该给定的位置,而$是指示它只匹配在该字符串的结尾符号。

  6. os.path.basename()用于检索基本名称

  7. 因为re.findall()(路径[即'abc123.txt''\a\b\c\abc123.txt']的最后部分)总是返回一个列表,以便检索仅匹配将涉及使用[0] (即['123',][0] =>'123'

  8. 因为检索到的数据是一个字符串,必须使用INT()把它更改为int,用于比较。 int是在#2中传递给key的内容。

  9. re.sub('\.txt$', '', file)第一个参数是一个正则表达式,第二个参数是将它替换为字符串,第三个参数是需要更换(即re.sub('a', '', 'banana') =>bnn因为它取代每a什么也没有)检查#字符串5有关正则表达式的更多信息

如果您需要任何更多的澄清,告诉我

进口的另一种方法是这样的:

import glob 
from re import sub, findall 
from os.path import basename 
file_list = glob.glob('/fulldirectory/*.txt') # get the list of file names that ends in .txt 
f = sorted(file_list, key = lambda x: int(findall('\d+\.txt$',basename(x))[0])) 

for file in f: 
    print(sub('\.txt$', '', file)) 

    # do your stuff.... 

有用的链接:

https://docs.python.org/3/library/re.html

https://docs.python.org/3/library/os.path.html

https://docs.python.org/3/tutorial/

+0

感谢。我结束了使用一个方法,从目录中取出数字并将它们保存到列表中。这是有效的 - 但它只在目录中没有其他数字的情况下才起作用,这并不理想。尽管如此,我将转向你的方法。我不完全理解它是如何工作的。 –

+0

你能解释一下basename方法吗?我不完全确定这些代码实际上在做什么。 –

+0

提示:排序方法有一个关键参数,您可以在其中传递一个函数来告诉它如何排序,如果您只想对最后两个数字进行排序,您可以这样做:'f = sorted(glob.glob(' /fulldirectory/*.txt'),key=lambda x:os.path.basename(x).rstrip(“.txt”)[ - 2:])' – abccd

0

只要是这样的:

f = glob.glob('/fulldirectory/*.txt') 

for files in f: 
    print files.split('\\')[-1].split('.')[0] 
+0

谢谢。这工作,但我也试图打印实际的文件名。上面的代码也打印整个目录。有没有办法解决这个问题? –

+0

当然,如果您遇到路径问题,请尝试编辑。 – zipa