在Python中同时处理两个文件

4 投票
6 回答
9377 浏览
提问于 2025-04-15 15:59

我有关于12340辆车的信息。这些信息被顺序存储在两个不同的文件里:

  1. car_names.txt,这个文件里每一行都是一辆车的名字
  2. car_descriptions.txt,这个文件里是每辆车的描述。每辆车的描述有40行,其中第6行是@CAR_NAME

我想用Python做的是:在car_descriptions.txt文件中,为每辆车的描述在第7行(这个地方是空的)添加对应的车名,位置是在@CAR_NAME之后。

我想到了以下步骤:

1) 先读取第一个文件,把车名存到一个列表里

2) 然后开始读取第二个文件,每次找到@CAR_NAME这个字符串,就在下一行写上车名

但我在想有没有更快的方法,让程序每次从两个文件中各读一行,然后进行修改。

谢谢

6 个回答

4

读取 car_names.txt 文件能节省一点点内存(在今天的标准下,这点内存真的是微不足道;-)),但速度上绝对不会比一次性读取更快(在最好的情况下,速度是一样的,可能还会稍微慢一点,除非你的操作系统和存储系统在读取时做得特别好,能够提前缓存和缓冲)。所以我建议:

import fileinput

carnames = open('car_names.txt').readlines()
carnamit = iter(carnames)

skip = False
for line in fileinput.input(['car_descriptions.txt'], True, '.bak'):
  if not skip:
    print line,
  if '@CAR_NAME' in line:
    print next(carnamit),
    skip = True
  else:
    skip = False

测量一下这个方法的速度,以及一个替代方法,

carnamit = open('car_names.txt')

在开始时,而不是像我第一版那样逐行读取所有内容——我敢打赌,第一版(如果有任何可测量和可重复的差异)会更快。

顺便提一下,标准库中的 fileinput 模块的文档可以在 这里 找到,它真的是一个方便的方式来对文本文件进行“虚拟就地重写”(通常会保留旧版本作为备份,以防万一——即使在操作过程中机器崩溃,旧版本的数据仍然会保留,所以在某种意义上,“重写”在机器崩溃时是原子操作,这真是个不错的小细节;-)。

9

首先,创建一个生成器,用来从一系列数据中提取汽车名称。你可以选择每隔七行提取一行;我这里的做法是提取每一行中紧跟着以 @CAR_NAME 开头的那一行:

def car_names(seq):
    yieldnext=False
    for line in seq:
        if yieldnext: yield line
        yieldnext = line.startswith('@CAR_NAME')

现在你可以使用 itertools.izip 来同时遍历这两个序列:

from itertools import izip
with open(r'c:\temp\cars.txt') as f1:
    with open(r'c:\temp\car_names.txt') as f2:
        for (c1, c2) in izip(f1, car_names(f2)):
            print c1, c2
8

我不太确定我是否完全理解你想要做的事情,是像这样吗?

f1 = open ('car_names.txt')
f2 = open ('car_descriptions.txt')
for car_name in f1.readlines ():
        for i in range (6):   # echo the first 6 lines
                print f2.readline ()
        assert f2.readline() == '@CAR_NAME'  # skip the 7th, but assert that it is @CAR_NAME
        print car_name    # print the real car name
        for i in range (33):  # print the remaining 33 of the original 40
               print f2.readline ()

撰写回答