Какой есть быстрый способ чтения файла и записи в файл?
У меня есть файл data.txt с данными:
111,Pablo1,Alar1,mail1,0,0
222,Pablo2,Alar2,mail2,0,0
333,Pablo3,Alar3,mail3,0,0
444,Pablo4,Alar4,mail4,0,0
555,Pablo5,Alar5,mail5,0,0
Сейчас я его считываю сначала в лист из строк, потом в листе эти строки преобразую также в листы и получается так:
list_of_lists = [
['111','Pablo1','Alar1','mail1','0','0']
['222','Pablo2','Alar2','mail2','0','0']
['333','Pablo3','Alar3','mail3','0','0']
['444','Pablo4','Alar4','mail4','0','0']
['555','Pablo5','Alar5','mail5','0','0']
]
Потом я изменяю какой-нибудь элемент:
new_list = list_of_lists
new_list[0][1] = '100000'
# new_list = [
# ['111','100000','Alar1','mail1','0','0']
# ['222','Pablo2','Alar2','mail2','0','0']
# ['333','Pablo3','Alar3','mail3','0','0']
# ['444','Pablo4','Alar4','mail4','0','0']
# ['555','Pablo5','Alar5','mail5','0','0']
# ]
После чего я листы в new_list преобразую в строки с пробелами и все перезаписываю в data.txt. Это очень много времени занимает с большими объемами данных.
Как можно это ускорить?
Знаю, что есть csv, но разве он сильно быстрее?
Ответы (2 шт):
Откройте для себя модуль Pandas!
import pandas as pd # pip install pandas
df = pd.read_csv("/path/to/file.csv", sep=",", dtype=str)
df.iloc[0, 1] = "100000"
df.to_csv("/path/to/result.csv", index=False)
Аргумент dtype=str - используется исключительно для ускорения парсинга CSV - этот параметр укажет pd.read_csv() не пытаться определить правильный тип данных для каждого столбца, а воспринимать все столбцы как строки.
PS советую сравнить скорость обработки данных вашим текущим способом и вариантом из этого ответа ;)
Если у вас нет жесткой привязки к формату хранения данных, то имеет смысл хранить данные либо в бинарных файлах (например Parquet, HDF5, Pickle, etc.) или же в реляционной БД (MariaDB, PostgreSQL, SQLite, etc.) - это может еще сильнее ускорить работу с данными. Кроме того при работе с БД - вы бонусом получаете вариант когда вы можете параллельно писать в таблицу разными потоками / процессами. Параллельное чтение данных поддерживают все известные мне реляционные БД.
NOTE: параллельная запись не поддерживается в SQLite, т.к. пишущий процесс эксклюзивно блокирует файл БД.
Здесь можно посмотреть слегка устаревший результат сравнения чтения / записи табличных данных для различных форматов файлов.
Разобрался с SQLite3 - это то, что нужно, можно очень быстро добавлять данные в таблицу, менять определенные ячейки, не перезаписывая весь файл. Но пока не понял как правильно открывать и закрывать базу данных.
db = sqlite3.connect('orders.db')
sql = db.cursor()
Открываю так, закрытия нет (там как-то с with это делается).
UPD1: Я так понял, что можно делать так:
db = sqlite3.connect('orders.db')
sql = db.cursor()
sql.execute(f"UPDATE data SET number = 1 WHERE username = 'username'")
db.commit()
db.close()
И можно так:
with db.cursor() as cursor:
cursor.execute(f"UPDATE data SET number = 1 WHERE username = 'username'")
db.commit()
UPD2: Методом выше нельзя - появляется ошибка:
Traceback (most recent call last):
File "C:\Users\aesok\Desktop\airdroper2\test.py", line 7, in <module>
with db.cursor() as cursor:
AttributeError: __enter__