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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.