Tôi đã nhìn xung quanh Stackoverflow và không thể tìm thấy câu trả lời cho câu hỏi cụ thể của tôi vì vậy hãy tha thứ cho tôi nếu tôi đã bỏ lỡ điều gì đó.
import re
target = open['output.txt', 'w']
for line in open['input.txt', 'r']:
match = re.search[r'Stuff', line]
if match:
match_text = match.group[]
target.write[match_text + '\n']
else:
continue
target.close[]
Tệp tôi đang phân tích cú pháp là rất lớn nên cần phải xử lý từng dòng.
Điều này [tất nhiên] để lại một dòng mới ở cuối tệp.
Làm thế nào tôi nên thay đổi tốt nhất mã này để trên lần lặp cuối cùng của vòng lặp 'nếu khớp', nó không đặt ký tự dòng phụ ở cuối tệp. Nó có nên nhìn qua tệp một lần nữa ở cuối và xóa dòng cuối cùng [mặc dù có vẻ hơi không hiệu quả]?
Các câu hỏi StackOverflow hiện có tôi đã tìm thấy bìa Xóa tất cả các dòng mới khỏi một tệp.
Nếu có một cách pythonic / hiệu quả hơn để viết mã này, tôi cũng sẽ hoan nghênh các đề xuất cho việc học của riêng tôi.
Cảm ơn đã giúp đỡ!
Hỏi ngày 9 tháng 8 năm 2013 lúc 2:50Aug 9, 2013 at 2:50
Fusilli Jerryfusilli JerryFusilli Jerry
7354 Huy hiệu vàng8 Huy hiệu bạc16 Huy hiệu đồng4 gold badges8 silver badges16 bronze badges
3
Một điều khác bạn có thể làm, là truncate
tệp. .tell[]
cung cấp cho chúng tôi số byte hiện tại trong tệp. Sau đó, chúng tôi trừ đi một, và cắt ngắn nó ở đó để loại bỏ dòng mới.
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
Trên Linux và MacOS,
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
0 là chính xác, nhưng trên Windows, nó cần phải là with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
1. Một phương pháp pythonic hơn để xác định cái nào là kiểm tra with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
2.import os
remove_chars = len[os.linesep]
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[] - remove_chars]
Câu trả lời của Kindal cũng hợp lệ, ngoại trừ bạn nói rằng đó là một tệp lớn. Phương pháp này sẽ cho phép bạn xử lý một tệp có kích thước terabyte trên một gigabyte của ram.'s answer is also valid, with the exception that you said it's a large file. This method will let you handle a terabyte sized file on a gigabyte of RAM.
Đã trả lời ngày 9 tháng 8 năm 2013 lúc 3:07Aug 9, 2013 at 3:07
Viết dòng mới của mỗi dòng ở đầu dòng tiếp theo. Để tránh viết một dòng mới ở đầu dòng đầu tiên, hãy sử dụng một biến được khởi tạo thành một chuỗi trống và sau đó đặt thành một dòng mới trong vòng lặp.
import re
with open['input.txt'] as source, open['output.txt', 'w'] as target:
newline = ''
for line in source:
match = re.search[r'Stuff', line]
if match:
target.write[newline + match.group[]]
newline = '\n'
Tôi cũng đã tái cấu trúc mã của bạn một chút [không cần thiết
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
3, bởi vì vòng lặp sẽ làm gì khác?] Và thay đổi nó để sử dụng câu lệnh with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
4 để các tệp được tự động đóng.Đã trả lời ngày 9 tháng 8 năm 2013 lúc 2:55Aug 9, 2013 at 2:55
Kindallkindallkindall
173K34 Huy hiệu vàng268 Huy hiệu bạc 301 Huy hiệu đồng34 gold badges268 silver badges301 bronze badges
0
Đường dẫn ngắn nhất từ những gì bạn có đến những gì bạn muốn có lẽ là lưu trữ kết quả trong danh sách, sau đó tham gia danh sách với Newlines và viết nó vào tệp.
import re
target = open['output.txt', 'w']
results = []
for line in open['input.txt', 'r']:
match = re.search[r'Stuff', line]
if match:
results.append[match.group[]]
target.write["\n".join[results]]
target.close[]
Voilà, không có thêm dòng mới ở đầu hoặc kết thúc. Có thể không quy mô rất tốt của danh sách kết quả là rất lớn. [Và giống như Kindall, tôi đã rời khỏi
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
5]Đã trả lời ngày 9 tháng 8 năm 2013 lúc 3:00Aug 9, 2013 at 3:00
Sean Redmondsean RedmondSean Redmond
3,82421 Huy hiệu bạc28 Huy hiệu đồng21 silver badges28 bronze badges
2
Vì bạn đang thực hiện cùng một Regex, bạn có thể muốn biên dịch nó trước đó.
import re
prog = re.compile[r'Stuff']
Tôi có xu hướng nhập từ và đầu ra đến
with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
6 và with open['a.txt', 'w'] as f:
f.write['abc\n']
f.write['def\n']
f.truncate[f.tell[]-1]
7 để đơn giản. Nhưng đó là một vấn đề của hương vị [và thông số kỹ thuật].from sys import stdin, stdout
Bỏ qua yêu cầu cụ thể về việc loại bỏ ____ 18 18 [1] cuối cùng, và chỉ giải quyết bit về việc học của bạn, toàn bộ điều có thể được viết như thế này:
from itertools import imap
stdout.writelines[match.group[] for match in imap[prog.match, stdin] if match]
[1] Như những người khác đã nhận xét, đây là một điều xấu, và thật khó chịu khi ai đó làm điều này.
Đã trả lời ngày 9 tháng 8 năm 2013 lúc 5:09Aug 9, 2013 at 5:09
Antakantakantak
18.1k8 Huy hiệu vàng68 Huy hiệu bạc78 Huy hiệu đồng8 gold badges68 silver badges78 bronze badges
2