Menghapus nomor halaman dari file .txt dengan Python

Saya mencoba memuat file .txt dari sebuah ebook dan menghapus baris yang berisi nomor halaman. Buku itu terlihat seperti:

2
Words
More words.

More words.

3
More words.

Inilah yang saya miliki sejauh ini:

x = 1

with open("first.txt","r") as input:
    with open("last.txt","wb") as output: 
        for line in input:
            if line != str(x) + "\n":
                output.write(line + "\n")
                x + x + 1

File keluaran saya keluar dengan semua spasi (baris baru) dihapus (yang tidak saya inginkan) dan bahkan tidak menghapus angkanya. Apakah ada yang punya ide? Terima kasih!


person Python Learner    schedule 08.04.2015    source sumber
comment
Apa yang Anda harapkan dari x + x + 1?   -  person jonrsharpe    schedule 08.04.2015
comment
Ups, maksud saya: x = x + 1. Namun, koreksi tersebut tidak menyelesaikan masalah apa pun (spasi putih atau tidak menghapus angka apa pun). Saya melakukannya karena setelah menemukan nomor halaman (misalnya halaman 1) saya ingin mencari nomor berikutnya (misalnya halaman 2). Hal ini juga akan membantu jika karena alasan tertentu buku tersebut memiliki satu baris penuh hanya dengan nomor yang bukan merupakan nomor halaman namun benar-benar merupakan bagian dari buku tersebut.   -  person Python Learner    schedule 08.04.2015
comment
Anda juga dapat menggunakan x += 1. Tapi bagaimana jika, seperti contoh, itu tidak dimulai di halaman 1?   -  person jonrsharpe    schedule 08.04.2015
comment
Sangat masuk akal, saya pikir saya akan mengeditnya secara manual.   -  person Python Learner    schedule 08.04.2015


Jawaban (4)


1) Anda tidak perlu membuka file Anda untuk biner open("last.txt","wb") -> open("last.txt","w") 2) x + x + 1 -> x += 1

Tapi, Anda bisa melakukannya dengan lebih sederhana

with open("first.txt","r") as input:
    with open("last.txt","w") as output: 
        for line in input:
            line = line.strip() # clear white space
            try: 
                int(line) #is this a number ?
            except ValueError:
                output.write(line + "\n")
person Tasos Vogiatzoglou    schedule 08.04.2015
comment
Anda tidak perlu strip dan menambahkan \n, int('2\r\n') bernilai 2. Selain itu, klausa kecuali kosong tidak boleh muncul dalam kode. Kesalahan tidak boleh terjadi secara diam-diam. Kecuali secara eksplisit dibungkam. Anda harus membuatnya eksplisit - metode int() akan memunculkan ValueError. - person Łukasz Rogalski; 08.04.2015
comment
Bisa jadi \s2\s bukan \r\n. Pengecualian apa lagi (yang kami tangani) yang dapat dilempar int(line)? - person Tasos Vogiatzoglou; 08.04.2015
comment
Saya tidak yakin apa maksud \s. int() dapat menangani sejumlah karakter awal dan akhir yang tercantum dalam string.whitespace. Tentang pengecualian - ìnt() juga dapat membuang TypeError, tetapi tidak pernah dalam konteks ini (garis selalu berupa string). Interpreter juga dapat memunculkan KeyboardInterrupt yang akan Anda diamkan. Dan Anda tidak pernah ingin melakukan itu. - person Łukasz Rogalski; 08.04.2015
comment
\s seperti di spasi. Saya tidak tahu tentang penanganan spasi, catat. Mengenai pengecualian, dalam contoh khusus ini, ini tidak terlalu berbahaya (kami mencoba menunjukkan caranya). Namun demikian, saya akan mengeditnya. - person Tasos Vogiatzoglou; 08.04.2015
comment
Ini berfungsi dengan baik di file saya. Terima kasih banyak semuanya! - person Python Learner; 08.04.2015

Solusi yang ditingkatkan - satu tingkat lekukan lebih sedikit, hindari strip dan penjumlahan string yang tidak perlu, pengecualian eksplisit tertangkap.

with open("first.txt","r") as input_file, open("last.txt","w") as output_file:
    for line in input_file:
        try: 
            int(line)
        except ValueError:
            output_file.write(line)
person Łukasz Rogalski    schedule 08.04.2015

Periksa apakah Anda dapat mengubah baris menjadi bilangan bulat dan lewati baris ini jika berhasil. Bukan solusi tercepat, tetapi harusnya berhasil.

try:
   int(line)
   # skip storing that line
   continue
except ValueError:
   # save the line to output
person Marek    schedule 08.04.2015
comment
Terlambat, jawaban Tasos justru seperti ini. - person Marek; 08.04.2015

Gunakan ekspresi reguler untuk mengabaikan baris yang hanya berisi angka.

import sys
import re

pattern = re.compile("""^\d+$""")

for line in sys.stdin:
    if not pattern.match(line):
        sys.stdout.write(line)
person Michael Paddon    schedule 08.04.2015
comment
Anda harus membuat string itu mentah, bukan multiline: r"^\d+$". - person jonrsharpe; 08.04.2015