首页 文章

但是,sys.stdin中的读取行会以循环结束

提问于
浏览
0

我试图从文本文件中读取行,但是我试图访问这些行,或者我认为 .

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都只是我教授的规范 .

我正在读的线条就像

“line 0.0 1.0 2.0 3.0”

一堆次 .

1 回答

  • 0

    在这一行:

    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
    

相关问题