-3

我对python真的很陌生,我每天都学到很多东西。我想做一个自动脚本来帮助我的工作。

我有一个包含一些文件的特定文件夹,我不希望我的工具是特定于文件的,因为我想重用这个脚本,所以我希望它在文件中查找特定标题,

假设该文件在“路径”行的中间某处,并且在其下有许多路径,例如“文件路径=”某些路径”

我希望我的脚本转到我指定的目录并查找包含此标题“路径”的文件,复制其中一个路径(它们将在它的正下方),就是这样。

然后我将使用这个路径来下载文件等等,但这部分我已经完成了。当给定特定文件夹并复制我想要的字符串时,我只是不知道如何在文件中查找特定字符串。

所以假设我有一个文件夹(C:\Folder),在文件夹中我有 3 个文件(1,2,3)

我想查找包含这种模式“路径”的文件并复制路径或至少其中一个在它下指定的路径。他们会像 "file path=C:\somepath" 所以文件内容就像

废话

废话

路径

文件路径=C:\somepath

文件路径=C:\somepath2

废话

我想复制 C:\somepath 并将其用作我工作的一部分。

非常感谢所有帮助者,这对我来说非常重要。

4

2 回答 2

1
于 2013-03-19T23:46:17.083 回答
-1

从您的评论来看,您的数据实际上是 XML,而您想要的是第一个节点中path每个(或第一个)file节点的属性paths

就 XML 解析器而言,这实际上更容易编写,而且更健壮。

例如,这些可能都是有效file节点:

<file path="C:\Foo\Bar" />
<file path="C:\Baz\Qux"/>
    <file path="C:\Foo\Bar" />
<file path="C:\Spam\Eggs\" alt="other attribute cruft" />
<file alt="other attribute cruft" path="C:\Spam\Eggs\" />
<file path="C:\Spam\Spam\"></file>

你甚至可能会看到这些,合法与否:

<file path='C:\Eggs\"Spam Spam Spam"\"Spammity Spam"'/>

您不想尝试以纯文本形式处理所有这些可能性。但是,如果你不处理所有这些——以及更多——墨菲定律保证你最终会遇到一个文件,其中包含你不处理的任何一个。

有许多不同的 XML 解析器,甚至内置在标准库中,但我认为最简单的是ElementTree。所以:

import os
import os.path
import xml.etree.ElementTree as ET

filepaths = {}
for filename in os.listdir(directory):
    try:
        doc = ET.parse(os.path.join(directory, filename))
        paths = doc.find('paths')
        filepaths[filename] = [f.attrib['path'] for f in paths.findall('file')]
    except Exception as e:
        # You may want to log something, treat different exceptions differently, etc.
        pass

应该很容易弄清楚如何改变它来处理所有paths节点而不是第一个节点,或者file下面的第一个节点paths而不是所有节点,或者第一个file具有path属性的节点等。

如果您使用的是 Python 2.x,并且文件非常大,这可能会有点慢。但是您可以通过显式使用cElementTree. 这样做很常见:

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

如果可能的话,这将为您提供快速的“C”实现,否则将在 CPython 2.5+(包括 3.x,两者合并在一起)、PyPy 等中为您提供慢速实现。


同时,从其他评论中,您要求提供原始帖子中没有的其他内容:

我只需要……把反斜杠变成 /

这很容易。只需调用s.replace('\\', '/')每条路径s

然而,这是一件很奇怪的事情。反过来很常见(它甚至内置在标准库中——<code>os.path.normpath 将在 POSIX 上单独保留斜杠,但在 Windows 上将它们转换为反斜杠),但从原生 Windows 到 POSIX 是通常是较大操作的一部分,例如构建 URL……在这种情况下,您可能希望使用更高级别的函数。

在文件中 - 我想要的结果是 C:\folder\folder

在这里,听起来您想去掉任何尾随反斜杠。再一次,这是一件奇怪的事情,你可能实际上想做一些比这更高级别的事情(比如os.path.dirname也许?),但很容易:s.rstrip('\\').

当然,最后两个是相互矛盾的——如果你想要的结果是C:\folder\folder,并且你将反斜杠转换为正斜杠,你将不会得到你想要的结果。

但希望我已经给了你足够的东西来建造你真正想要的东西。

于 2013-03-20T02:09:17.207 回答