Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在目录中搜索包含文件夹路径的特定文件,并在python中复制该文件_Python_String_Path_Copy - Fatal编程技术网

在目录中搜索包含文件夹路径的特定文件,并在python中复制该文件

在目录中搜索包含文件夹路径的特定文件,并在python中复制该文件,python,string,path,copy,Python,String,Path,Copy,我对python真的很陌生,每天都学到很多东西。 我想做一个自动脚本,这将有助于我的工作 我有一个包含一些文件的特定文件夹,我不希望我的工具是特定于文件的,因为我想重用此脚本,所以我希望它在文件中查找特定的标题 让我们说文件在中线的某个地方,在许多路径下面,比如文件路径=某些路径 我希望我的脚本转到我指定的目录,并查找包含此标题路径的文件 复制其中一条路径,它们就在它下面,就这样 然后我将使用这个路径下载文件和更多,但这部分我已经做了。 我只是不知道在给定特定文件夹时如何在文件中查找特定字符串并

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

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

让我们说文件在中线的某个地方,在许多路径下面,比如文件路径=某些路径

我希望我的脚本转到我指定的目录,并查找包含此标题路径的文件 复制其中一条路径,它们就在它下面,就这样

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

假设我有一个文件夹C:\文件夹 文件夹里有3个文件1,2,3

我想寻找一个包含这种模式路径的文件 并复制路径或其下指定的至少一个路径。 它们将类似于file path=C:\somepath 因此,文件内容如下

布拉布拉

布拉布拉

路径

文件路径=C:\somepath

文件路径=C:\somepath2

布拉布拉

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


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

第一步是查看目录中的所有文件。那太好了

接下来,需要在循环中打开每个文件。到目前为止,我们已经:

for filename in os.listdir(directory):
    with open(filename) as f:
现在,我们如何处理每个文件?我们可以在整个文件中读取一些不同的选项,或者对其进行mmap,然后使用str.find或regex方法对其进行解析,或者我们可以逐行跟踪我们的状态,或者我们可以使用itertools函数转换行序列,或者我们可以构建一个状态机并运行它,或者

我认为对于新手来说,最简单的方法是手动逐行操作。但是让我们用一个函数来结束它。因此:

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))
找到第一行后我怎么能停下来

读完第一行就休息一下。因此,与此相反:

if line.startswith('file path='):
    paths.append(line[len('file path='):])
else:
    break
paths = []
for filename in os.listdir(directory):
    with open(filename) as f:
        paths.append(parse_file(f))
这样做:

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[filename] = parse_file(f)
我如何修复它,将路径放在字典的不同索引中,因为它将所有路径都放在第一个字段中

现在,你不是在创建字典,而是在创建列表

如果您想要一个字典,比如说,将每个文件映射到该文件中的文件路径列表,这很容易。与此相反:

if line.startswith('file path='):
    paths.append(line[len('file path='):])
else:
    break
paths = []
for filename in os.listdir(directory):
    with open(filename) as f:
        paths.append(parse_file(f))
这样做:

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[filename] = parse_file(f)
但是,如果您只需要一个值,那么首先不构建列表可能会更简单。如果找到路径名,只需返回路径名;如果找不到路径名,则返回不可能是None的路径名

如何修改有问题的路径。因为文件中的路径是以这种格式保存的,我只想复制C:\folder\folder


首先,我的代码甚至找不到这种格式的东西。您要求查找文件路径=…(file path=…)之类的行,因此我使用了startswith,但从您的注释来看,您的数据实际上是XML,您需要的是第一个路径节点中每个或第一个文件节点的path属性

这实际上更容易编写,而且对于XML解析器来说更健壮

例如,这些可能都是有效的文件节点:

应该很容易弄清楚如何更改它以处理所有路径节点而不是第一个,或者路径下的第一个文件节点而不是所有路径节点,或者具有路径属性的第一个文件节点,等等

如果您使用的是Python2.x,并且文件非常大,这可能有点慢。但是可以通过显式使用cElementTree来解决这个问题。这样做很常见:

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
如果可能的话,这将为您提供快速的C实现,而在CPython 2.5+中,包括3.x中,速度较慢的C实现,在3.x中,这两个实现合并在一起,PyPy,等等

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

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

那很容易。只需在每个路径s上调用s.replace“\\”、“/”

然而,这是一件奇怪的事情。另一种方法是非常常见的,它甚至内置在标准库中-os.path.normpath将在POSIX上不使用斜杠,但在Windows上将其转换为反斜杠,但从本机Windows转换为POSIX通常是更大操作的一部分,就像构建一个URL…在这种情况下,您可能希望使用更高级别的函数

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

在这里,听起来像是要去掉任何尾随的反斜杠。同样,这是一件奇怪的事情,您可能真的想做一些比这更高级别的事情,比如os.path.dirname,但很简单:s.rstrip'\\'

当然,如果您想要的结果是C:\folder\folder,并且您将反斜杠转换为 向前斜杠,你不会得到你想要的结果


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

非常感谢你,但我没有什么问题。找到第一行后我怎么能停下来?或者我如何修复它,将路径放在字典的不同索引中,因为它将所有路径都放在第一个字段中,最后我想使用一个。我的第二个问题是如何修改有问题的路径。因为文件中的路径是以这种格式保存的,我只想复制C:\folder\folder。谢谢因为你有很多问题,让我更新答案。好的,不需要回答第一个问题,我只做路径[0][0],但是我如何操作路径,脚本现在的结果是它原来的文件中的C:\folder\folder\/>-我想要的结果是C:\folder\folder-谢谢!嗯,我已经回答了这两个部分和它们的所有子部分。正如我所说的,如果你试图解析XML,你首先应该这么说,而且你可能不应该这样做。我在玩你说的xml解析器,有一些问题。因此,我的文件有很多文本,但是在中间,我有,我有我不知道我在做什么错误,我的文件看起来像这样-在它下面和更多的路径在相同的格式,结束后,在文件的顶部,在底部有更多的东西。我运行了你编写的代码,在filepath中得到的是空的{},在path中没有。如果你需要帮助,你应该从用正确的英语解释你的问题开始。现在,你的标点符号和语法搞砸了,不可能听懂你想说的话。