使用Python从重定向的stdin读取文件

7
我将尝试读取通过命令行重定向stdin的文本文件的内容,并在接收方需要将其重新组装为原始形式时通过互联网发送它。
例如:
$ python test.py < file.txt

我尝试使用以下受链接启发的代码读取文件并将其重新组装:

for line in sys.stdin:
  stripped = line.strip()
  if not stripped: break
  result = result + stripped

print "File is beeing copied"
file = open("testResult.txt", "w")
file.write(result)
file.close()
print "File copying is complete!"

但是这个解决方案只有在我没有空行(两个'\n'相连)的情况下才有效,如果我有空行,我的循环就会中断,文件读取也就结束了。我该怎么读取标准输入直到达到被重定向的文件的结尾符号<>?


1
file.write(sys.stdin.read()) - William Pursell
对于像我这样傻的人,如果你要进入SO(Stack Overflow)的坑之前,请确保你的终端在与".txt"文件相同的目录中(否则它将运行一个空文件)。 - user2529589
3个回答

10

你为什么要查看这些数据:

result = sys.stdin.read()

4

如果您不想中断程序,而只是想继续执行下一行代码,可以使用continue。当迭代器到达文件结尾时,程序会自动停止。

import sys
result = ""
for line in sys.stdin:
    stripped = line.strip()
    if not stripped:
        continue
    result += stripped

2

line.strip()用于去除读入行末的换行符。

如果需要保留换行符,则无需使用该语句(请检查输出文件是否有输入的换行符)。

那个if stripped部分是用于查找空行,并且在原代码中是作为循环的终止条件。

但这不是您想要终止循环的标志。所以,不要使用它。

sys.stdin到达输入的结尾时,循环将自动结束(即EOF)。

删除line.strip(),删除if not stripped: break,将result = result + stripped替换为result = result + line,然后将其写入文件以获取简单(但可能昂贵)的cp脚本。

如果您想对它们进行操作,则可能有更有效的方法来从标准输入中读取所有行(具体取决于您的目标)。


是的,你说得对,去除是不必要的(因为它会改变读取的文本,而这不是我的目标)。而且,“William Pursell”提出了一种更“高效的方法来做到这一点”。 - user3717551

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接