在Python中同时处理两个文件

2024-05-14 20:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有12340辆车的信息。此信息按顺序存储在两个不同的文件中:

  1. car_names.txt,其中包含一行用于表示每辆车的名称
  2. car_descriptions.txt,包含每辆车的说明。每辆车有40行,第6行写着“车名”

我想在python中完成:为了在car_descriptions.txt文件中为每辆车添加第7行中每辆车的名称(来自另一个文件)(它是空的),就在@car_name之后

我想:

1)读取第一个文件并将车辆名称存储在矩阵/列表中 2) 开始读取第二个文件,每次找到字符串@CAR_NAME时,只需在下一行写下名称

但我想知道是否有更快的方法,所以程序每次从每个文件读取一行并进行修改。

谢谢


Tags: 文件字符串nametxt名称信息列表names
3条回答

阅读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模块是文档化的here,它确实是一种执行文本文件“虚拟重写”的方便方法(通常将旧版本作为备份,以防万一——但即使机器在操作过程中崩溃,旧版本的数据仍会存在,因此在感觉到“重写”在机器崩溃时是原子性的,一点小小的触碰;-)。

首先,生成一个从序列中检索汽车名称的生成器。你可以每7行屈服一次;我已经让我的屈服,无论哪一行跟在以@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

我不确定我是否完全明白你想做什么,是不是这样?

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 ()

相关问题 更多 >

    热门问题