Python: 当从管道接收文件时,如何将 URL 获取到文件?

Python: How to get the URL to a file when the file is received from a pipe?

我在 Python 中创建了一个可执行文件,其输入是 URL 文件,输出是文件,例如

file:///C:/example/folder/test.txt --> url2file --> the file

实际上,URL 存储在一个文件中 (url.txt),我 运行 使用管道从 DOS 命令行获取它:

type url.txt | url2file

效果很好。

我想在 Python 中创建一个可执行文件,其输入是文件,输出是文件的 URL,例如

a file --> file2url --> URL

同样,我正在使用 DOS 并通过管道连接可执行文件:

type url.txt | url2file | file2url

问题:file2url正在接收文件。如何获取文件的 URL(或路径)?

'file2url' 通过标准输入(如键盘)接收数据。 数据由内核传输,不一定要有任何文件系统表示。因此,如果没有文件,则没有 URL 或路径供您获取。

一般来说,你可能做不到。

如果url没有存储在文件中,我好像很难得到url。想象一下有人给你读一段文字。没有进一步的信息,您无法知道它来自哪本书。

但是在某些情况下您可以这样做。

将 url 与文件一起通过管道传输。

如果您需要 url 并且可以做到这一点,请尝试将 url 与文件放在一起。使 url2file 先通过管道传输 url,然后再通过管道传输文件。

重组您的管道

如果您重组管道,也许您不需要找到文件的 url。

索引你的文件

如果只有特定的文件可以通过管道传输到 file2url,您可以预先计算所有文件的哈希值并将其与 url 一起存储在您的程序中。在 python 中,您可以使用 dict 来执行此操作,其中键是文件(作为字符串),值是 url。您可以使用 pickle 将 dict 对象写入文件并在程序开始时加载它。

然后你可以简单地从这个字典中查找 url。

您可能想研究资源管理器中的数据库或搜索功能如何处理索引或替代解决方案。

正在搜索文件

您可以使用文件的重要行并在 linux 上使用 grephead 之类的内容来搜索 所有 个文件您的计算机用于此行。请注意 grephead 是程序,而不是 python 函数。对于 DOS,您可能需要 google 等效程序。

仅供参考:grep 在文件中搜索一行文本。 head 输出文件的前几行。我建议只比较文件的前几行以避免搜索巨大的文件。

搜索计算机上的所有文件可能需要很长时间。

您只能搜索与管道输入大小相同的文件。

使用url.txt

如果 file2url 知道文件 url.txt 的位置,那么您可以查找 url.txt 中的所有文件,直到找到与传送到的文件相同的文件你的程序。您可以将它与哈希/索引解决方案结合起来。

让我们尝试通过明显的方式来做到这一点:

$ cat test.py | python test.py 
import sys
print ''.join(sys.stdin.readlines())
print sys.stdin.name

<stdin>

因此,文件名是“”,因为对于 python 没有文件名 - 只有输入。

另一种方式是依赖于系统的。找到一个命令行,例如,它被使用过,但不能保证它会起作用。