Đây là một giải pháp Python đẹp, gọn gàng. Tôi đã không cố gắng để được terse ở đây.
Điều này sửa đổi tệp tại chỗ, thay vì tạo một bản sao của tệp và tước dòng mới từ dòng cuối cùng của bản sao. Nếu tệp lớn, điều này sẽ nhanh hơn nhiều so với giải pháp Perl được chọn là câu trả lời tốt nhất.
Nó cắt một tệp bằng hai byte nếu hai byte cuối là CR / LF hoặc một byte nếu byte cuối cùng là LF. Nó không cố gắng sửa đổi tệp nếu (các) byte cuối không phải là (CR) LF. Nó xử lý lỗi. Đã thử nghiệm trong Python 2.6.
Đặt cái này trong một tập tin gọi là "thoát y" và chmod +x striplast
.
#!/usr/bin/python
# strip newline from last line of a file
import sys
def trunc(filename, new_len):
try:
# open with mode "append" so we have permission to modify
# cannot open with mode "write" because that clobbers the file!
f = open(filename, "ab")
f.truncate(new_len)
f.close()
except IOError:
print "cannot write to file:", filename
sys.exit(2)
# get input argument
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = "--help" # wrong number of arguments so print help
if filename == "--help" or filename == "-h" or filename == "/?":
print "Usage: %s <filename>" % sys.argv[0]
print "Strips a newline off the last line of a file."
sys.exit(1)
try:
# must have mode "b" (binary) to allow f.seek() with negative offset
f = open(filename, "rb")
except IOError:
print "file does not exist:", filename
sys.exit(2)
SEEK_EOF = 2
f.seek(-2, SEEK_EOF) # seek to two bytes before end of file
end_pos = f.tell()
line = f.read()
f.close()
if line.endswith("\r\n"):
trunc(filename, end_pos)
elif line.endswith("\n"):
trunc(filename, end_pos + 1)
PS Theo tinh thần "Perl golf", đây là giải pháp Python ngắn nhất của tôi. Nó đưa toàn bộ tập tin từ đầu vào tiêu chuẩn vào bộ nhớ, loại bỏ tất cả các dòng mới ở cuối và ghi kết quả vào đầu ra tiêu chuẩn. Không ngắn gọn như Perl; bạn không thể đánh bại Perl vì những thứ nhanh nhẹn như thế này.
Xóa "\ n" khỏi cuộc gọi đến .rstrip()
và nó sẽ xóa toàn bộ khoảng trắng khỏi phần cuối của tệp, bao gồm nhiều dòng trống.
Đặt cái này vào "slurp_and_chomp.py" và sau đó chạy python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))