2013-02-18 22 views
-1

我被要求读取一个文件中的行并将该文件中的每隔一行打印到另一个文件中。这是我迄今为止。将字符串转换为文件中的整数

my_file = open("thisFile.txt", "r") 
out_file = open("thatFile.txt", "w") 

for line in my_file: 
    line = int(line) 
    if line%2 !=0: 
     print(line,file=out_file)  

my_file.close() 
out_file.close() 
+3

你的问题是什么?什么不起作用,如果它抛出异常,你会得到什么异常? – 2013-02-18 00:48:51

回答

1

这是一个相对简单的任务 - 你的主要问题是使用的int() - 你想整条生产线转换为数字,然后失败。你想要做的就是跟踪你所在线路的号码。最简单的方法是使用the enumerate() builtin

with open("thisFile.txt") as in_file, open("thatFile.txt") as out_file: 
    for line_no, line in enumerate(in_file, start=1): 
     if line_no % 2: 
      out_file.write(line) 

注意这里使用with语句太 - 这将自动关闭文件,并且将这样做,即使出现异常,它的使用是个好习惯。它也更具可读性。

+0

为什么在这一个downvote? – 2013-02-18 00:55:14

+0

我们还没有学过或因此我无法使用 – user2016535 2013-02-18 00:56:01

+2

@ user2016535这是您的学习机会。这是一个非常简单的功能。 – 2013-02-18 00:56:28

4
from itertools import islice 

with open('input') as fin, open('output', 'w') as fout: 
    fout.writelines(islice(fin, None, None, 2) 
+0

+1是聪明的,但我得说,“islice(fin,None,None,2)'”让我觉得这是六个月后你不得不重读的代码。这太糟糕了,你不能写'islice(fin,step = 2)'。 – zwol 2013-02-18 01:25:00

+0

@破解它不是“聪明” - 每个人都应该认识到作品的内涵。但是,是的,同意,可惜它不能这么做:( – 2013-02-18 01:29:42

0

最小改变你的程序,使其做你想做的,带来无新的概念,是这样的:

my_file = open("thisFile.txt", "r") 
out_file = open("thatFile.txt", "w") 

i = 1 
for line in my_file: 
    if i % 2 != 0: 
     print(line, file=out_file) 
    i += 1 

my_file.close() 
out_file.close() 

你的错误是简单,你以为int(line)会给你行号。实际上做的是试图将每行的文本解释为整数,而这不是您想要的。

现在,很多Python的优点在于其庞大的有用函数库。以上的作品,但没有适当的优势,语言所提供的。我会改变的第一件事是使用enumerate而不是一个明确的计数器,我会改变的第二件事是使用write文件的方法而不是print,我会改变的第三件事是利用“非零是真正的“规则:

my_file = open("thisFile.txt", "r") 
out_file = open("thatFile.txt", "w") 

for i, line in enumerate(my_file, start=1): 
    if i % 2: 
     out_file.write(line) 

my_file.close() 
out_file.close() 

我说,这工作,但真的它只工作,除非出现问题。如果有任何事件抛出异常(例如,如果发生I/O错误),则文件对象不会关闭。 with声明告诉Python确保文件关闭,无论是否发生异常;这很方便也少输入。

with open("thisFile.txt", "r") as my_file, 
    open("thatFile.txt", "w") as out_file: 
    for i, line in enumerate(my_file, start=1): 
     if i % 2: 
      out_file.write(line) 

您可能会注意到这与Lattyware的答案相同。 (乔恩·克莱门特的答案是也许有点聪明。他似乎是playing golf

在这一段简单的代码,如果有异常情况发生的CPython的垃圾收集器通知该文件对象不再可访问,并会为你关闭它们,但这不是你可以依赖的程序,因为你的程序变得更加复杂。

+0

高尔夫版本不会导入itertools。只需读取整个文件到内存'fout.writelines(list(fin)[:: 2])' – 2013-02-18 01:19:30

+0

谢谢很多zack,这正是我想要的。 – user2016535 2013-02-18 01:21:43

+0

还不知道我在打高尔夫球:)除非使用可用的工具/ libs现在打高尔夫! – 2013-02-18 01:24:54