【问题标题】:Reading lines from sys.stdin however ends up in a loop然而,从 sys.stdin 读取行最终会进入循环
【发布时间】:2016-03-30 21:30:22
【问题描述】:

我正在尝试从文本文件中读取行,但是我在尝试访问这些行时遇到了困难,或者我认为是这样。

import sys
import math
import re

CANVAS_HEIGHT = 500
CANVAS_WIDTH = 500

SVG_HEADER = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="%d" height="%d">\n'
SVG_BOUNDING_BOX = '<rect x="0" y="0" width="%d" height="%d" style="stroke:#000;fill:none" />\n'
SVG_LINE = '<line x1="%d" y1="%d" x2="%d" y2="%d" style="stroke:#000" />\n'
SVG_FOOTER = '</svg>'

print SVG_HEADER % (CANVAS_WIDTH, CANVAS_HEIGHT)
print SVG_BOUNDING_BOX % (CANVAS_WIDTH, CANVAS_HEIGHT)

try:
    line_number = 0
    for S in sys.stdin:
        line_number = line_number + 1

        L = S.split()
        try:
            x0 = float(L[1])
            y0 = float(L[2])
            x1 = float(L[3])
            x1 = float(L[4])
        except:
            sys.stderr.write('Error in line %d: %s\n' % (line_number, S))

    print SVG_LINE, x0, y0, x1, y1
except:
    sys.stderr.write('Cannot open: %s\n' % sys.argv[1])

print '%s\n' % (SVG_FOOTER)

在终端,我卡在了

对于 sys.stdin 中的 S:

如果您想知道,这段代码的目的是取行并将它们转换为 svg 格式。所有的 sys.stderr.write 只是我教授的规范。

我正在阅读的台词就像

"行 0.0 1.0 2.0 3.0"

很多次。

【问题讨论】:

  • edit该问题为您正在使用的编程语言添加标签并删除当前标签,所有这些似乎都很笼统,但对其他人找到您的问题没有帮助。
  • 你如何调用你的程序?
  • python lines_to_svg.py lines_files.txt
  • 该语法不会将lines_files.txt 连接到程序的标准输入,因此您的for 循环从终端读取。

标签: python svg stdin sys


【解决方案1】:

在这一行:

for S in sys.stdin:

您的程序没有卡住,它正在等待输入。尝试输入:

line 0.0 1.0 2.0 3.0

后跟 EOF 指示符(在 UNIX 和衍生产品中:^D。在 MS-DOS 和衍生产品中:^Z)。您可能需要输入两次 EOF 指示符。

如果您尝试从文本文件而不是控制台读取,您需要在程序中打开文本文件,或者在 shell 中使用文件重定向:

选项 1:

# If you always use the same input file:
with open("somefile.txt") as fp:
    for S in fp:
        ...

# If you always have exactly one command-line parameter:
with open(sys.argv[1]) as fp:
    for S in fp:

或者,我最喜欢的,因为fileinput 允许您指定一个、多个或不指定命令行参数,

# If you want to specify file(s) on the command line
import fileinput
...
for S in fileinput.input():
    ...

选项 2:

$ python my_program.py < somefile.txt

C:\Users\me> python my_program.py < somefile.txt

【讨论】:

  • 应该添加命令行:python lines_to_svg.py lines_file.txt
  • 改用python lines_to_svg.py &lt; lines_file.txt
  • 我无法修改命令行输入,因为我的教授将使用“pythonlines_to_svg.pylines_file.txt”来测试我的程序
  • 然后考虑我的答案中的option 1 选项之一。
  • 是的,我使用了 fileinput 并且它有效。话虽这么说,我过去曾以非常相似的方式使用过 sys.stdin,而且效果很好。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 2020-11-28
  • 2019-09-23
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多