2013-11-12 4 views
0

Я новичок в python. Я хочу, чтобы мой скрипт печатал все, кроме последней строки. Я попробовал [: -1], но я не могу заставить его работать. Я знаю, что код ниже не идеален, поскольку он является одним из моих первых, но он делает все, что мне нужно, чтобы это ожидалось ... Я не хочу, чтобы он печатал самую последнюю строку строки. Пожалуйста, помогитеКак не печатать последнюю строку

import requests 


html = requests.get("") 

html_str = html.content 
Html_file= open("fb_remodel.csv",'a') 
html_str = html_str.replace('},', '},\n') 
html_str = html_str.replace(':"', ',') 
html_str = html_str.replace('"', '') 
html_str = html_str.replace('T', ' ') 
html_str = html_str.replace('+', ',') 
html_str = html_str.replace('_', ',') 
Html_file.write(html_str[:-1]) 
Html_file.close() 

ответ

4

html_str - это строка, а не список.

Вы можете сделать что-то вроде этого:

txt='''\ 
Line 1 
line 2 
line 3 
line 4 
last line''' 

print txt.rpartition('\n')[0] 

Или

print txt.rsplit('\n',1)[0] 

Различная между rpartition и rsplit можно было увидеть в документации. Я бы выбрал один или другой на основе того, что я хотел бы сделать, если символ разделения не найден в целевой строке.

Кстати, Вы можете написать свой файл открыть этот путь:

with open("fb_remodel.csv",'a') as Html_file: 
    # blah blah 
    # at the end -- close is automatic. 

Использование with является очень распространенным Python идиомы.

Если вы хотите общего метода отбрасывания последних п строк, это будет сделать это:

Сначала создайте тестовый файл:

# create a test file of 'Line X of Y' type 
with open('/tmp/lines.txt', 'w') as fout:  
    start,stop=1,11 
    for i in range(start,stop): 
     fout.write('Line {} of {}\n'.format(i, stop-start)) 

Затем вы можете использовать deque являются проходными и выполнить действие:

from collections import deque 

with open('/tmp/lines.txt') as fin: 
    trim=6        # print all but the last X lines 
    d=deque(maxlen=trim+1) 
    for line in fin: 
     d.append(line) 
     if len(d)<trim+1: continue 
     print d.popleft().strip() 

распечаток:

Line 1 of 10 
Line 2 of 10 
Line 3 of 10 
Line 4 of 10 

При печати дека д, вы можете увидеть, где линии пошли:

>>> d 
deque(['Line 5 of 10\n', 'Line 6 of 10\n', 'Line 7 of 10\n', 'Line 8 of 10\n', 'Line 9 of 10\n', 'Line 10 of 10\n'], maxlen=7) 
+1

Возможно, стоит обратить внимание на то, что если ваша строка поступает из текстового файла Windows, это может привести к завершению '\ r'. В этом случае строка исходит из исходного литерала, и в реальном случае OP это происходит от 'запросов', поэтому в любом случае я не думаю, что это проблема, о которой нужно беспокоиться, поэтому этот ответ является совершенным. – abarnert

+0

@abarnert: Да, это очень верно. Будет ли открытие файла в режиме универсальной линии, исправить это? Не быть парнем Виндзоза - я могу только догадываться. – dawg

+0

Да, это тоже сработает. Единственная проблема заключалась бы в том, что если бы у вас был текстовый файл, который вы не открывали в универсальном режиме новых строк (или последовательность строк, считанных с stdin, или что-то в этом роде). – abarnert

-2

Используйте массив для заполнения всех текстовых один за другим. Затем используйте условие while() или if. Это может помочь вам: Reading & Writing files in Python

Пример:

>>> for line in f: 
     print line 

Затем используйте перерыв до появления последней итерации.

+0

Вы не можете поместить строки в ['array'] (http://docs.python.org/2/library/array.html). И я не уверен, как он будет использовать условие 'if'. И «замена» будет намного менее эффективной, если он будет делать это по строкам.(Также обратите внимание, что в некоторых случаях его вызовы 'replace' даже меняют количество строк, что будет путать.) – abarnert

+0

В отредактированной версии« использовать разрыв до последней итерации »не очень полезно, потому что есть нет пути к _know_, последняя итерация произошла, пока не стало уже слишком поздно. – abarnert

Смежные вопросы