8

到目前为止,我有这个代码:

 f = open("text.txt", "rb")
 s = f.read()
 f.close()
 f = open("newtext.txt", "wb")
 f.write(s[::-1])
 f.close()

原始文件中的文本是:

This is Line 1
This is Line 2
This is Line 3
This is Line 4

当它反转并保存它时,新文件如下所示:

 4 eniL si sihT 3 eniL si sihT 2 eniL si sihT 1 eniL si sihT

当我希望它看起来像这样时:

 This is line 4
 This is line 3
 This is line 2
 This is line 1

我怎样才能做到这一点?

4

9 回答 9

13

您可以执行以下操作:

with open('test.txt') as f,  open('output.txt', 'w') as fout:
    fout.writelines(reversed(f.readlines()))
于 2013-11-03T14:14:15.977 回答
4

read()在单个字符串中返回整个文件。这就是为什么当你反转它时,它也会反转线条本身,而不仅仅是它们的顺序。您只想反转行的顺序,您需要使用readlines()来获取它们的列表(作为第一个近似值,它相当于s = f.read().split('\n')):

s = f.readlines()
...
f.writelines(s[::-1])
# or f.writelines(reversed(s))
于 2013-11-03T14:12:47.030 回答
2
f = open("text.txt", "rb")
s = f.readlines()
f.close()
f = open("newtext.txt", "wb")
s.reverse()
for item in s:
  print>>f, item
f.close()
于 2013-11-03T14:15:45.140 回答
1

该方法file.read()返回整个文件的字符串,而不是行。

而且由于s是整个文件的字符串,因此您正在反转字母,而不是行!

首先,您必须将其拆分为行:

s = f.read()
lines = s.split('\n')

或者:

lines = f.readlines()

而你的方法,已经是正确的了:

f.write(lines[::-1])

希望这可以帮助!

于 2013-11-03T14:13:11.523 回答
1

这里有几个步骤。首先,我们想从第一个文件中获取所有行,然后我们想以相反的顺序将它们写入新文件。执行此操作的代码如下

lines = []
with open('text.txt') as f:
    lines = f.readlines()

with open('newtext.txt', 'w') as f:
    for line in reversed(lines):
        f.write(line)

首先,我们初始化一个变量来保存我们的行。然后我们从“test.txt”文件中读取所有行。其次,我们打开我们的输出文件。在这里,我们以相反的顺序循环遍历这些行,同时将它们写入输出文件。

于 2016-08-18T05:55:25.103 回答
0

如果您的操作系统用于\n换行,请像这样使用它

f = open("text.txt", "rb")
 s = f.read()
 f.close()
 f = open("newtext.txt", "wb")
 f.write(reversed(s.split("\n")).join("\n"))
 f.close()

这里的主要内容是reversed(s.split("\n")).join("\n")

它执行以下操作:

  1. 用换行符分割你的字符串 - \n,
  2. 结果是array
  3. 反转数组
  4. \n将带有换行符的数组合并回string

这里的状态:

  1. 细绳:line1 \n line2 \n line3
  2. 大批:["line1", "line2", "line3"]
  3. 大批:["line3", "line2", "line1"]
  4. 细绳:line3 \n line2 \n line1 \n
于 2013-11-03T14:13:27.737 回答
0

一个使用列表的示例,这样会更容易:我确信答案更优雅,但这种方式很容易理解。

f = open(r"c:\test.txt", "rb")
s = f.read()
f.close()

rowList = []
for value in s:
    rowList.append(value + "\n")
rowList.reverse()


f = open(r"c:\test.txt", "wb")

for value in rowList:
    f.write(value)
f.close()
于 2013-11-03T14:14:27.077 回答
0

你必须一行一行地工作。

f = open("text.txt", "rb")
s = f.read()
f.close()
f = open("newtext.txt", "wb")
lines = s.split('\n')
f.write('\n'.join(lines[::-1]))
f.close()
于 2013-11-03T14:16:04.437 回答
0

如果您的输入文件太大而无法放入内存,这是一种有效的反转方法:

  1. 将输入文件拆分为部分文件(仍按原始顺序)。
  2. 从最后到第一个读取每个部分文件,将其反转并附加到输出文件。

执行:

import os
from itertools import islice

input_path = "mylog.txt"
output_path = input_path + ".rev"

with open(input_path) as fi:
    for i, sli in enumerate(iter(lambda: list(islice(fi, 100000)), []), 1):
        with open(f"{output_path}.{i:05}", "w") as fo:
            fo.writelines(sli)

with open(output_path, "w") as fo:
    for file_index in range(i, 0, -1):
        path = f"{output_path}.{file_index:05}"
        with open(path) as fi:
            lines = fi.readlines()
        os.remove(path)
        for line in reversed(lines):
            fo.write(line)
于 2019-04-02T13:45:49.550 回答