【问题标题】:how to read 2 files line by line and edit each line after being processed如何逐行读取2个文件并在处理后编辑每一行
【发布时间】:2014-01-20 22:01:52
【问题描述】:

我有如下代码,如果在 file1 中读取的行符合我的条件,我想编辑/更新我的 file1。否则,我想编辑file2中满足另一个条件的行:

with gzip.open('/my/file1.txt.gz', 'r') as f:
    for line in csv.reader(f, delimiter="\t"):
        if (str(line[3]) == "C"):
            # edit/update the line from file 1
        else:
            with gzip.open('/my/file2.txt.gz', 'r') as f2:
                for line2 in csv.reader(f2, delimiter="\t"):
                    if line2[0] == line[0]:
                        # edit/update the line2 from file 2

有什么方法可以实现吗?提前致谢!

【问题讨论】:

    标签: python io fopen


    【解决方案1】:

    这一行中的一些东西:

    keys = set()
    with gzip.open('/my/file1.txt.gz', 'r') as src_file:
        for line in csv.reader(src_file, delimiter="\t"):
            if (str(line[3]) == "C"):
                # edit/update the line from file 1
            else:
                keys.add(line[0])
    
    with gzip.open('/my/file2.txt.gz', 'r') as target_file:
        for line in csv.reader(target_file, delimiter="\t"):
            if line[0] in keys:
    

    【讨论】:

      【解决方案2】:

      一些问题:

      • 您正在尝试更新只读文件;

      • 您似乎想在阅读过程中更新文件。对于纯文本文件,只要替换字符串与要替换的字符串长度完全相同,就可以这样做。 但是这是一个压缩文件 - 我认为你会损坏文件。

      • 您每次要修改第二个文件时都在重新读取它。

      如果可能的话,我建议将整个作品读入内存,进行更改,然后将其全部写回:

      import csv, gzip
      from collections import defaultdict
      
      def read_gzip(fname):
          with gzip.open(fname, 'rb') as inf:
              incsv = csv.reader(inf, delimiter='\t')
              return list(incsv)
      
      def write_gzip(fname, data):
          with gzip.open(fname, 'wb') as outf:
              outcsv = csv.writer(outf, delimiter='\t')
              outcsv.writerows(data)
      
      def main():
          f1, f1_dirty = read_gzip('/my/file1.txt.gz'), False
          f2, f2_dirty = read_gzip('/my/file2.txt.gz'), False
      
          # make row index on f2
          idx = defaultdict(list)
          for row in f2:
              idx[row[0]].append(row)
      
          # process files
          for row in f1:
              if row[3] == 'C':
                  # modify row data
                  f1_dirty = True
              else:
                  for other in idx[row[0]]:
                      # modify other
                      f2_dirty = True
      
          if f1_dirty: write_gzip('/my/file1.txt.gz', f1)
          if f2_dirty: write_gzip('/my/file2.txt.gz', f2)
      
      if __name__=="__main__":
          main()
      

      【讨论】:

        猜你喜欢
        • 2021-02-14
        • 1970-01-01
        • 2019-09-02
        • 2021-06-02
        • 1970-01-01
        • 2012-11-30
        • 2016-04-10
        • 2013-04-28
        相关资源
        最近更新 更多