Выборочная замена имен заголовков csv - PullRequest
0 голосов
/ 01 июня 2018

Я искал решение для этого и не смог найти его.У меня есть каталог папок, которые содержат несколько очень больших CSV-файлов.Я перебираю каждый CSV-файл в каждой папке в каталоге, чтобы заменить значения определенных заголовков.Мне нужно, чтобы заголовки были согласованы (от файла к файлу), чтобы запустить другой сценарий для правильной обработки всех данных.

Я нашел это решение, которое, хотя и работал бы: изменить первую строкуфайл в python .

Однако это не работает, как ожидалось.Мой код:

        from_file = open(filepath)
            # for line in f:
            #     if
        data = from_file.readline()
            # print(data)
        # with open(filepath, "w") as f:
        print 'DBG: replacing in file', filepath
            # s = s.replace(search_pattern, replacement)
        for i in range(len(search_pattern)):
            data = re.sub(search_pattern[i], replacement[i], data)
            # data = re.sub(search_pattern, replacement, data)
        to_file = open(filepath, mode="w")
        to_file.write(data)
        shutil.copyfileobj(from_file, to_file)

Я хочу заменить значения заголовка в search_pattern значениями в replacement без сохранения или записи в другой файл - я хочу изменить файл.Я также попытался

        shutil.copyfileobj(from_file, to_file, -1)

Насколько я понимаю, это должно копировать весь файл, а не разбивать его на куски, но, похоже, это не влияет на мой вывод.Возможно ли, что CSV слишком велик?

Я не смог определить другой способ сделать это или заставить этот способ работать.Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 01 июня 2018

этот ответ из изменить первую строку файла в python , с которого вы скопировали, не работает в windows

В Linux вы можете открыть файл дляЧтение и запись одновременно.Система гарантирует отсутствие конфликта, но за кулисами обрабатываются 2 различных файловых объектов.И этот метод очень небезопасен: если происходит сбой программы во время чтения / записи (отключение питания, диск заполнен) ... у файла есть большой шанс быть усеченным / поврежденным.

В любом случаев Windows вы не можете открыть файл для чтения и записи одновременно, используя 2 маркера.Он просто уничтожает содержимое файла.

Таким образом, есть 2 варианта, которые являются переносимыми и безопасными:

  1. создать файл в том же каталоге, после копирования скопировать, удалить первый файли переименуйте новую

Примерно так:

import os
import shutil

filepath = "test.txt"

with open(filepath) as from_file, open(filepath+".new","w") as to_file:
    data = from_file.readline()
    to_file.write("something else\n")
    shutil.copyfileobj(from_file, to_file)
os.remove(filepath)
os.rename(filepath+".new",filepath)

Это не займет много времени, поскольку операция rename выполняется мгновенно.Кроме того, если программа / компьютер дает сбой в любой момент, один из файлов (старый или новый) является действительным, поэтому он безопасен.

если шаблоны имеют одинаковую длину, используйте режим чтения / записи

следующим образом:

filepath = "test.txt"

with open(filepath,"r+") as rw_file:
    data = rw_file.readline()
    data = "h"*(len(data)-1) + "\n"
    rw_file.seek(0)
    rw_file.write(data)

Здесь мы, читая строку, заменяем первую строку на ту жеколичество h символов, перемотайте файл и напишите первую строку назад, перезаписав предыдущее содержимое, сохранив оставшиеся строки.Это также безопасно, и даже если файл огромен, он очень быстрый.Единственным ограничением является то, что шаблон должен быть точно такого же размера (иначе у вас будут остатки предыдущих данных, или вы перезапишете следующую строку (и), так как данные не сдвинуты)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...