Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Python 3.x - Fatal编程技术网

python的文件和异常

python的文件和异常,python,python-3.x,Python,Python 3.x,所以我一直在写这段代码,从另一个文件中打印出几行文本。我只是做了一个包含4行文本的文件,并在列出的行之前创建了一个print语句来指示它是哪一行。如何修改代码,使其在没有文本时不打印第五行指示器 这是它的打印方式: a = 1 inPut = input("Please enter a file name: ") infile = open(inPut, "r") line = infile.readline() print("/*", a ,"*/", line) while line !=

所以我一直在写这段代码,从另一个文件中打印出几行文本。我只是做了一个包含4行文本的文件,并在列出的行之前创建了一个print语句来指示它是哪一行。如何修改代码,使其在没有文本时不打印第五行指示器

这是它的打印方式:

a = 1
inPut = input("Please enter a file name: ")
infile = open(inPut, "r")

line = infile.readline()
print("/*", a ,"*/", line)
while line !="" :
    a = a + 1
    line = infile.readline()
    print("/*",a,"/*", line)

infile.close()
我希望将其打印为:

/* 1 */ Hello
/* 2 */ My name 
/* 3 */ is 
/* 4 */ John
/* 5 */

您可以在读取输入后中断循环

/* 1 */ Hello
/* 2 */ My name 
/* 3 */ is 
/* 4 */ John

在我看来,您的问题更适合使用for循环而不是while循环。大概是这样的:

for a, line in enumerate(infile, 1):
    print("/*", a, "*/", line)
input_filename = input("Please enter a file name: ")
with open(input_filename) as infile:
    for (line_number, line) in enumerate(infile, 1):
        if line:
            print("/*",a,"/*", line)
需要注意的改进:

  • 文件句柄本身是一个迭代器,因此您不需要使用
    readlines
    或类似的方法,您可以直接对其进行迭代
  • 使用
    with
    语句正确打开和关闭文件句柄
  • 使用
    枚举
    获取行号(替换计数器变量)
  • 更具描述性的变量名
  • 如果行的条件是空字符串为false,则非空字符串为true
您可以使用for循环,并结合open file-like对象的readlines()函数。此外,您可能应该使用enumerate来枚举您已阅读的行,如下所示:

for a, line in enumerate(infile, 1):
    print("/*", a, "*/", line)
input_filename = input("Please enter a file name: ")
with open(input_filename) as infile:
    for (line_number, line) in enumerate(infile, 1):
        if line:
            print("/*",a,"/*", line)
在本例中,我将变量“a”的名称更改为“index”

另一个技巧是使用(Python 2.5中新增的)在完成文件句柄时自动关闭它:

inPut = input("Please enter a file name: ")
infile = open(inPut, "r")

for index, line in enumerate(infile.readlines()):
    print("/*", index, "/*", line)

infile.close()

你能解释一下break语句是如何工作的吗?我还没有谈到这个术语。谢谢它只是终止循环。只要你第一次“中断”并转到循环后的任何地方,就可以摆脱它。@F.J的答案更好,不过就你应该采取的一般方法而言。根本不需要调用
.readlines()
;文件对象是可编辑的。那不打印
/*0*/Hello
?枚举()的第二个参数是可选的,它是默认为
0
的起始索引,我在这里使用
1