알렉스가 설명 하듯이 텍스트 파일은 무작위로 액세스하거나 수정할 수 없습니다. 새 데이터를 텍스트 파일의 중간에 삽입하려면 완전히 새로운 파일을 작성해야합니다.
하지만 실제로 문제가 있습니까? 당신은 단지 5 번만하고 있습니다. 현대 컴퓨터는 엄청난 양의 순차적 데이터를 하드 드라이브에 스팸으로 보내고 무작위로 검색하고 쓰는 것이 좋지 않기 때문에 낭비되는 시간은 그다지 크지 않을 수 있습니다. 그리고 이것은 간단합니다. 예 :
bakpath = path+'.bak'
os.rename(path, bakpath)
with open(path, 'rb') as infile, open(bakpath, 'wb') as outfile:
writer = csv.writer(outfile)
for row, newvalue in zip(csv.reader(infile), newvalues):
row.append(newvalue)
writer.writerow(row)
만약 그렇다면 몇 가지 개선 방법이 있습니다.
대부분 분명, 당신은 데이터베이스 (같은 sqlite3
) 또는 테이블 시스템 (같은 pandas
또는 pytables
) 대신 CSV 파일을 사용할 수 있습니다. 이미 작성되고 사용하기 쉽고, 당신이 생각하는 것보다 더 잘 최적화 될 것입니다.
또는 각 열에 대해 별도의 파일을 사용하십시오. closing_all
은 다음 stdlib에 내장되지 않도록
with closing_all([open(path, 'rb') for path in paths]) as files):
for row in zip(*files):
# each row is a tuple of columns
,하지만 당신은 하찮게을 작성할 수 있습니다 : 그들은 하나 개의 파일만큼이나 당신은 여전히 다음과 같이 액세스 할 수 있습니다 당신이 필요로하는 경우
@contextmanager
def closing_all(things):
try:
yield things
finally:
for thing in things:
thing.close()
마지막에 모든 파일을 하나의 파일로 병합하는 것은 간단합니다. 즉 N 시간 대신에 전체를 한 번 다시 작성한다는 의미입니다.
직접 임의 파일을 만들 수도 있습니다. 당신이 사전에 알고 있지만하지 경우 대략 추정
COLUMN_LENGTHS = 20, 15, 41, 12, 19
COLUMN_STARTS = [0] + list(itertools.accumulate(COLUMN_LENGTHS))
ROW_LENGTH = COLUMN_STARTS[-1] + 1
def read_cell(f, row, column):
f.seek(row * ROW_LENGTH + COLUMN_STARTS[column])
return f.read(COLUMN_LENGTHS[column]).rstrip()
def write_cell(f, row, column, value):
f.seek(row * ROW_LENGTH + COLUMN_STARTS[column])
padded = value.ljust(COLUMN_LENGTHS[column])
f.write(padded)
수, 당신은 항상 할 수 있습니다 사전에 열 최대 열 길이와 번호를 알고 있다면, 당신은 공백 각 열은 단지 패드를 수 list
과 유사한 클래스가 사용하는 동일한 트릭을 사용하십시오. 과대 평가. 쓴 것으로 밝혀지면, 기존의 것을 상수로 복사하여 새로 확장 된 버전으로 복사하십시오. 즉, N 번 대신 N 번만 파일 로그를 다시 쓰는 것입니다.
또 다른 대안은 파일을 전치 형식으로 유지하는 것입니다. 따라서 새로운 열 대신 새로운 행을 추가하는 것입니다. 그냥 'a'
모드에서 파일을 열고 쓰기 만하면됩니다.
필요하다면 언제든지 다시 끝낼 수 있습니다. 즉, N 번 대신 파일을 한 번 다시 작성합니다.
여러분이 가지고있는 이상한 들여 쓰기입니다. –
파이썬은 공백 문자이므로 들여 쓰기를 확인하십시오. – thegrinner
왜이 용도로 데이터베이스를 사용하지 않습니까? 파일을 고수하고 싶다면 어떤 종류의 데이터에 따라 ['pandas'] (http://pandas.pydata.org/) 또는''numpy' (http://www.numpy.org/)를 사용하십시오 너는 상대하고있다. 그렇지 않으면 전체 파일을 읽고 열을 추가 한 다음 파일을 다시 써야합니다. –