Софтуерно Инженерство
Loading...
deqn_22 avatar deqn_22 2 Точки

Как да се избегне новата линия?

Здравейте, въпросът ми е относно относно четене на файлове, по-конкретно от последната задача в края на 3-та лекция за променяне на цените в каталог.

Ето кодът ми:

"""

    Change prices for products
    of different kind with 75% or more.

"""

import random

# Dictionary with a mapping of how much we should change
# the prices of different clothing - it will be random between 75% and 80%

CATALOG_PRICES_SAMPLE = 'catalog_sample.csv'
CATALOG_PRICES_FULL = 'catalog_full.csv'
CATALOG_PRICES_FULL_MODIFIED = 'catalog_full_modified.csv'

dictionary_increase_in_prices = {}
index_price = 6
index_clothing_type = 4

with open(CATALOG_PRICES_FULL, 'r') as file_to_read:
    with open(CATALOG_PRICES_FULL_MODIFIED,'w') as file_to_write:

        for line_read in file_to_read:
                line_read = line_read.strip()
                line_read = line_read.split(',')
                line_read[6] = float(line_read[6])
                clothing_type = line_read[index_clothing_type]
                if clothing_type not in dictionary_increase_in_prices:
                    dictionary_increase_in_prices.setdefault(clothing_type,random.uniform(1.75,1.80))
                line_read[6] = line_read[6]*dictionary_increase_in_prices[clothing_type]
                line_read[6] = str(line_read[6])
                line_to_write = (',').join(line_read)
                file_to_write.write(line_to_write + '\n')
                

Въпросът ми е - как мога да избегна да пиша нова линия в края на новия файл, без да зареждам всичко в паметта? Знам, че мога да заредя новия файл в лист и след това да направя лист = лист[:-1] и после пак да го запиша, но има ли по - добър подход от гледна точка на памет и време?

Тагове:
1
Python
b.yordanov avatar b.yordanov 146 Точки

Под 

with open(CATALOG_PRICES_FULL_MODIFIED,'w') as file_to_write:

слагаш:

total_file_lines = len(file_to_read.readlines())

current_line = 0

и после преди 

file_to_write.write(line_to_write + '\n')

можеш да напишеш нещо от сорта на

if current_line != total_file_lines:

append-ваш '\n' към line_to_write

----------------------------------------------------------------------------------------

Това мисля ще ти помогне да го направиш както искаш но според мен няма нужда да го правиш. Когато пишеш във файла ти записваш съдържанието на този ред + символът за нов ред \n и по този начин всеки нов ред е разделен от предходния. В случай, че го направиш по твоя начин, след последния ред маркера няма да слезе на долния и тук идва другия момент. Какво се случва ако отвориш файла file_to_write в режим 'a', т.е. да append-ваш към него? В случай, че последния ред от файла свършва веднага след текст-а когато апенднеш новото съдържание към него то няма да започне от новия ред а ще залепи последния ред и първия ред от новия файл. Нещо от сорта на:
old-line 1 \n
old-line 2 \n
old-line 3 \n
(да предположим, че това е последния ред и го записваме без \n)
old-line4
При добавяне ново на съдържание към файла ще получиш следното:
> old-line4new-line1\n
new-line2\n
new-line3\n

и т.н.

Така, че най-добре не го изчиствай този символ от последния ред, но все пак зависи от това какво точно искаш да направиш.
Друго нещо което видях в твоя код. Използваш '6' вместо index_price

Дано да си разбрал нещо от тази каша :)

 

2