第一步是查看目录中的所有文件。那是os.listdir
。
接下来,您需要在循环中打开每个文件。所以,到目前为止,我们得到了:
for filename in os.listdir(directory):
with open(filename) as f:
现在,我们对每个文件做什么?有几个不同的选项 - 我们可以在整个文件(或mmap
它)中读取,然后使用str.find
或正则表达式方法来解析它,或者我们可以一行一行地跟踪我们的状态,或者我们可以转换我们可以建立一个状态机并运行它,或者...
我认为对于新手来说最简单的就是手动逐行执行。但让我们把它包装在一个函数中。所以:
def parse_file(f):
paths = []
found_paths = False
for line in f:
line = line.strip()
if not found_paths:
if line == 'paths':
found_paths = True
else:
if line.startswith('file path='):
paths.append(line[len('file path='):])
else:
break
return paths
paths = []
for filename in os.listdir(directory):
with open(filename) as f:
paths.append(parse_file(f))
我怎样才能找到第一个行后停止?
只读break
看完第一行后。所以,与其这样:
if line.startswith('file path='):
paths.append(line[len('file path='):])
else:
break
这样做:
if line.startswith('file path='):
paths.append(line[len('file path='):])
break
我怎么能解决这个问题就摆在不同的指数的路径在字典中,因为它把所有的人都在第一场
那么现在,你是不是创建一个字典,你要创建一个列表。
如果您想要一个字典,将每个文件映射到该文件中的文件路径列表,这很容易。取而代之的是:
paths = []
for filename in os.listdir(directory):
with open(filename) as f:
paths.append(parse_file(f))
这样做:
paths = {}
for filename in os.listdir(directory):
with open(filename) as f:
paths[filename] = parse_file(f)
但是,它可能是简单的不能建立在首位的列表,如果你只想要一个值。如果你找到一个,你只需要返回路径名,如果你不这样做的话,它不可能是一个路径名(如None
)。
我该如何修改有问题的路径。因为文件的路径保存在这种格式 - 我只想复制C:\文件夹\文件夹
嗯,首先,我的代码甚至不会找到与该格式事情。您要求找到像file path=…
这样的行,因此我使用了startswith
,但<file path=
不以此开头。所以你首先需要改变你检查的startswith
。同时,您还需要处理引号和尖括号。
在这一点上,它看起来像只是愚蠢的文字处理可能不是正确的答案。这看起来像XML。解析XML文档的最简单方法是使用XML解析器,如xml.elementtree
。如果它不是一个XML文件,只要有卡在它的XML节点基于行的文件,你可以仍然尝试解析每行一个XML文档,但它可能是更容易使用re
用合适的正则表达式(例如,r'<file path="(.*?)"/>'
将仅匹配引号之间的部分)。不知道你的实际输入文本的样子,我不能给你任何东西比这更具体。
最后,在完成该步骤后,它看起来像要从目录路径中删除尾部反斜杠,所以即使该文件有C:\folder\folder\
,也会得到C:\folder\folder
。你可以在os.path
此使用的功能,但如果你确定的路径总是会在Windows格式,它可以更简单,只是告诉它删除任何尾随的反斜杠,与rstrip('\\')
。 (请注意那里的双反斜杠,因为您需要在Python字符串中跳出反斜杠。)
好吧,如果你期待帮助,你应该先用适当的英语解释你的问题。 现在,不可能遵循你想说的话,用你的标点和语法搞砸了。 – geenux 2013-03-28 00:12:24