การลบหมายเลขหน้าออกจากไฟล์ .txt ใน Python

ฉันกำลังพยายามโหลดไฟล์ .txt ของ eBook และลบบรรทัดที่มีหมายเลขหน้าออก หนังสือเล่มนี้ดูเหมือนว่า:

2
Words
More words.

More words.

3
More words.

นี่คือสิ่งที่ฉันมี:

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

ไฟล์เอาต์พุตของฉันออกมาโดยลบช่องว่าง (บรรทัดใหม่) ทั้งหมดออก (ซึ่งฉันไม่ต้องการ) และไม่ได้ลบตัวเลขด้วยซ้ำ ไม่มีใครมีความคิดใด ๆ ? ขอบคุณ!


person Python Learner    schedule 08.04.2015    source แหล่งที่มา
comment
คุณคาดหวังว่า x + x + 1 จะทำอะไร?   -  person jonrsharpe    schedule 08.04.2015
comment
อ๊ะ ฉันหมายถึง: x = x + 1 แต่ถึงกระนั้น การแก้ไขที่ไม่ได้แก้ไขปัญหาอย่างใดอย่างหนึ่ง (ช่องว่างหรือการไม่ลบตัวเลขใดๆ) ฉันทำแบบนั้นเพราะเมื่อเจอเลขหน้าแล้ว (เช่น หน้าที่ 1) ฉันอยากให้มันค้นหาหน้าถัดไป (เช่น หน้าที่ 2) วิธีนี้ยังช่วยได้ในกรณีที่หนังสือเล่มนี้มีทั้งบรรทัดโดยมีเพียงตัวเลขที่ไม่ใช่หมายเลขหน้า แต่เป็นส่วนหนึ่งของหนังสือจริงๆ   -  person Python Learner    schedule 08.04.2015
comment
คุณยังสามารถใช้ x += 1 ได้ แต่ถ้าหากตามตัวอย่าง มันไม่ได้เริ่มที่หน้า 1 ล่ะ?   -  person jonrsharpe    schedule 08.04.2015
comment
สมเหตุสมผลอย่างยิ่ง ฉันเพิ่งคิดว่าจะแก้ไขด้วยตนเอง   -  person Python Learner    schedule 08.04.2015


คำตอบ (4)


1) คุณไม่จำเป็นต้องเปิดไฟล์ของคุณสำหรับไบนารี open("last.txt","wb") -> open("last.txt","w") 2) x + x + 1 -> x += 1

แต่คุณสามารถทำได้ง่ายกว่านี้มาก

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
คุณไม่จำเป็นต้อง strip และต่อท้าย \n, int('2\r\n') ประเมินเป็น 2 นอกจากนี้ bareยกเว้น clause ไม่ควรปรากฏในโค้ด ข้อผิดพลาดไม่ควรผ่านไปอย่างเงียบๆ เว้นแต่จะปิดปากไว้อย่างชัดเจน คุณควรทำให้ชัดเจน - int() วิธีการจะเพิ่ม ValueError - person Łukasz Rogalski; 08.04.2015
comment
อาจเป็น \s2\s ไม่ใช่ \r\n มีข้อยกเว้นอื่นใด (ที่เราดูแล) int(line) โยนได้? - person Tasos Vogiatzoglou; 08.04.2015
comment
ฉันไม่แน่ใจว่า \s หมายถึงอะไร int() สามารถจัดการจำนวนอักขระนำหน้าและต่อท้ายที่ระบุใน string.whitespace ได้ตามใจชอบ เกี่ยวกับข้อยกเว้น - ìnt() สามารถส่ง TypeError ได้เช่นกัน แต่ไม่เคยอยู่ในบริบทนี้ (บรรทัดจะเป็นสตริงเสมอ) ล่ามยังสามารถยก KeyboardInterrupt ซึ่งคุณจะเงียบไว้ และคุณไม่ต้องการทำอย่างนั้น - person Łukasz Rogalski; 08.04.2015
comment
\s เช่นเดียวกับในช่องว่าง ฉันไม่รู้เกี่ยวกับการจัดการช่องว่าง เกี่ยวกับข้อยกเว้น ในตัวอย่างนี้ มันค่อนข้างไม่มีอันตราย (เรากำลังพยายามแสดงวิธี) อย่างไรก็ตาม ฉันจะแก้ไขมัน - person Tasos Vogiatzoglou; 08.04.2015
comment
มันใช้งานได้ดีกับไฟล์ของฉัน ขอบคุณมากทุกคน! - person Python Learner; 08.04.2015

โซลูชันที่ได้รับการปรับปรุง - ระดับการเยื้องน้อยลงหนึ่งระดับ หลีกเลี่ยงการ strip และการรวมสตริงที่ไม่จำเป็น พบข้อยกเว้นที่ชัดเจน

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

ตรวจสอบว่าคุณสามารถแปลงบรรทัดเป็นจำนวนเต็มได้หรือไม่ และข้ามบรรทัดนี้หากสำเร็จ ไม่ใช่วิธีแก้ปัญหาที่เร็วที่สุด แต่ควรใช้งานได้

try:
   int(line)
   # skip storing that line
   continue
except ValueError:
   # save the line to output
person Marek    schedule 08.04.2015
comment
สายเกินไปแล้ว คำตอบของ Tasos ก็คือสิ่งนี้ - person Marek; 08.04.2015

ใช้นิพจน์ทั่วไปเพื่อละเว้นบรรทัดที่มีเพียงตัวเลข

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
คุณควรทำให้สตริงนั้นเป็นข้อมูลดิบ ไม่ใช่หลายบรรทัด: r"^\d+$" - person jonrsharpe; 08.04.2015