2009-03-18 11 views
18

Używam skryptu Python do znajdowania i zamiany pewnych ciągów w plikach tekstowych danego katalogu. Używam modułu fileinput w celu ułatwienia operacji znajdowania i zamiany, tj. Plik jest odczytywany, zastępowany tekstem i zapisywany z powrotem do tego samego pliku.Python: Zapobieganie wypływowi plików z dodawania znaków nowej linii

Kod wygląda następująco:

import fileinput 
def fixFile(fileName): 
    # Open file for in-place replace 
    for line in fileinput.FileInput(fileName, inplace=1): 
     line = line.replace("findStr", "replaceStr") 
     print line # Put back line into file 

Problemem jest to, że pliki mają napisane:

  1. jedna pusta linia dodaje się po każdy linii.
  2. Ctrl-M znak na końcu każdej linii.

Jak zapobiec wprowadzaniu dodatkowych dodatków do plików?

Odpowiedz

31

Twoje nowe linie pochodzą z funkcją druku

zastosowanie:

import sys 

sys.stdout.write ('some stuff') 

i przerw linii odejdzie

+1

Wielkie dzięki! Naprawiono zarówno dodatkowe linie, jak i znaki Ctrl-M. Wybrałem twoją odpowiedź jako rozwiązanie tego problemu. Śmiało i dodaj dodatkowe informacje do swojej odpowiedzi, jeśli chcesz. –

+1

Czy możesz dodać trochę szczegółów? :) – Pitto

11

Zastosowanie

print line, 

lub

file.write(line) 

ustalić dodatkowe znaki nowej linii.

Od [Ctrl] - [M] - prawdopodobnie jest to spowodowane plikami wejściowymi w kodowaniu DOS.

+0

Dzięki. Twoje rozwiązanie usuwa puste wiersze, ale nadal ma znaki Ctrl-M.Inna osoba już zasugerowała odpowiedź, która rozwiązuje obie dla mnie. –

7

zamiast tego:

print line # Put back line into file 

użyj tego:

print line, # Put back line into file 
6

zmienić pierwszy wiersz w pętli do:

line = line.rstrip().replace("findStr", "replaceStr")

+0

Proszę wyjaśnić głosowanie w dół. Ta metoda rozwiązuje problem nowej linii (chociaż nie mogłem odtworzyć problemu Ctrl-M, więc nie mogę z nim rozmawiać). – kmote

+1

Problem z tą odpowiedzią polega na tym, że jest to w gruncie rzeczy "hack", usuwający oryginalny znak nowej linii, a nie tylko unikający dodawania w pierwszej kolejności (pokrytej innymi odpowiedziami na rok przed publikacją!). Pewnie dlatego otrzymałeś zniżkę. –

0

Ze względu na każdym rachunku iteracja wydruku kończy się znakiem nowej linii, otrzymujesz pusty wiersz między wierszami.

Aby rozwiązać ten problem, można użyć paska wraz z nadrukiem.

import fileinput 
def fixFile(fileName): 
    for line in fileinput.FileInput(fileName, inplace=1): 
    line = line.replace("findStr", "replaceStr") 
    print line.strip() 

Teraz widać puste linie są paski.

+0

Spowoduje to również usunięcie wcięcia, które może nie być pożądane. Zamiast tego użyj rstrip() :) – mjd2

2

W przypadku aktualizacji na Pythonie 4.3, można po prostu użyć:

print(line, end = '') 

aby uniknąć wstawiania nowej linii.

+6

Python ** 4.3 ** ?? :) – errata

Powiązane problemy