【问题标题】:Write a function that returns a data.txt in reverse [duplicate]编写一个反向返回data.txt的函数[重复]
【发布时间】:2015-04-11 01:32:27
【问题描述】:

我对 Python 编程还很陌生,我一直不知道如何在函数中反向返回数据。

例如,如果 data.txt 包含:

Chaos reigns within. 
Reflect, repent, and reboot 
Order will return.

调用 write_reversed('data.txt') 将打印:

Order will return.
Reflect, repent, and reboot
Chaos reigns within.

我目前写的代码是

def write_reversed(filename):
    """returns with words in reverse order in the file"""
    with open(filename, 'r') as write_reversed:
        for line in write_reversed:
            return filename[::-1]

我已将我的代码粘贴到 Pylint 检查器中,它显示“未使用的变量 'line'”

【问题讨论】:

  • 您正在返回而不是打印和反转文件名而不是文件的行。您可以在write_reversed 上使用reversed 函数;它会返回一个迭代器(比如write_reversed),你可以使用for
  • 您的问题似乎已经回答了here。如果文件很大,我建议使用this

标签: python python-3.x


【解决方案1】:

您收到unused variable 错误,因为(显然)您在声明后没有使用该变量。也许你的意思是:

for line in write_reversed:
     return line[::-1]

但是,您可以执行以下操作

def write_reversed(filename):
    """returns with words in reverse order in the file"""
    content = []
    with open(filename, 'r') as write_reversed:
        for line in write_reversed:
            content.append(line)
    return list(reversed(content))

【讨论】:

  • for line in write_reversed: return line[::-1] 将只返回第一行,字符颠倒。所需的输出是整个输入文件,其行以相反的顺序排列。
  • 除了重复使用函数名作为局部变量名的混乱之外,当它具有与content = list(write_reversed)content = write_reversed.readlines() 相同的效果时,为什么要首先执行整个循环?除此之外,为什么首先要从迭代器中列出一个列表?
【解决方案2】:

首先,它显示“未使用的变量line”,因为您从不使用line。您应该使用它而不是 filename - 实际上,您正在打开一个文件,然后对于文件中的每一行,您向后返回文件名(这只发生一次,因为 return 将结束函数)。

相反,建立一个list,然后return 反向列表。

def write_reversed(filename):
    """returns with words in reverse order in the file"""
    reversed = []
    with open(filename, 'r') as write_reversed:
        for line in write_reversed:
            reversed.append(line)
    return reversed[::-1]

【讨论】:

  • 和 A.J 的回答一样,你为什么要首先建立一个列表——而且,即使你需要一个列表,为什么要以如此笨拙的方式来做,而不是只打电话给 @987654328 @?
  • 如何以笨拙的方式而不是明显和简单的方式建立列表?
  • 通过循环来追加项目并不“笨拙”。它演示了如何在完成一项简单任务的同时遍历文件中的行,除此之外,它实际上完成了问题的要求。为什么认为这没有帮助?
  • “我今天过得很糟糕,痛苦爱陪伴”投票总是很有趣。 :P
  • 毫无理由地编写与内置函数完全相同的不必要复杂的东西绝对是笨拙的。你为什么不写一个循环来反转列表,而不是使用reversed[::-1]?或者使用TextIOBase(BufferedReader(FileIO(…))) 而不是open
【解决方案3】:

您正在反转文件名而不是文件的行。有一个 reversed 函数可用,它返回一个迭代器,用于遍历你反向传递的任何内容。文件对象是可迭代的(这就是为什么你可以使用 for 遍历它们的行),所以你可以直接将你的传递给 reversed

def reversed_lines(filename):
    """returns with words in reverse order in the file"""
    with open(filename, 'r') as f:
        return list(reversed(f))

如果函数应该打印行而不是返回它们,只需使用 forreversed(f) 而不是 f

【讨论】:

  • 认为他可能想要一个字符串,而不是一个列表……在这种情况下你想要return ''.join(reversed(f))。但我可能读错了他的想法。
【解决方案4】:

您可以打开文件。 readlines 将返回文件中的行。

for l in F.readlines()[::-1]:
     print l.strip()

会做好的

如果你想返回内容,你只需要这样写:

return "\n".join([l.strip() for l in F.readlines()[::-1]])

【讨论】:

  • 这个函数应该是return新的内容。
  • 不是很清楚:“write_reversed('data.txt') 会打印”
  • 为什么使用readlines?他已经有了行的迭代器——文件本身。
  • 是的。不过,它确实说“如何返回数据”,并且代码示例有一个return。我的猜测是return 的提及是正确的,而通过调用打印的提及是错误的。
【解决方案5】:

我不知道你的问题是什么,但这是一条两条线:

with open(filename, 'r') as f:
    print(*reversed(f.readlines()), sep='')

您也可以简单地将反转的行作为迭代器或列表返回:

with open(filename, 'r') as f:
    return reversed(f.readlines()) # optional: wrap expr. in list()

那么打印你想要的输出就这么简单:

reversed_lines = write_reversed(filename)
print(*reversed_lines, sep='')

注意:write_reversed 对于实际上不向缓冲区写入任何内容的函数来说是一个错误的函数名称。

【讨论】:

  • 应该是return的内容。
  • 你不需要去掉这些行,然后用'\n' 重新加入它们(并且可能不想这样做,因为这会丢失任何尾随的换行符);只是''.join 未剥离的线条。但除此之外,很好的解释试图涵盖他可能意味着的所有事情。 :)
  • 如果您切换到 Python 3,您可以执行 print(*reversed_lines, sep='\n') 之类的操作。 :)
  • @TigerhawkT3:实际上,根据他的标签,OP 已经使用 3.x。 (这意味着此答案需要编辑为 3.x 语法。)但更重要的是,如果您首先不需要 strip 行,则不需要 sep='\n'
  • 我的意思是,如果 Shashank 切换到 3,就像酷人一样。 :) 而且我认为剥离线条的原因是为了让一些更纯粹的东西可以继续工作,以防我们想对它们进行一些其他操作,比如将它们添加到另一个字符串的中间。
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多