Hướng dẫn python edit file in-place - python chỉnh sửa tệp tại chỗ

81

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Có thể phân tích từng dòng tệp và chỉnh sửa một dòng tại chỗ trong khi đi qua các dòng không?

Đã hỏi ngày 27 tháng 3 năm 2011 lúc 23:39Mar 27, 2011 at 23:39

BlankmanblankmanBlankman

252K315 Huy hiệu vàng747 Huy hiệu bạc1172 Huy hiệu đồng315 gold badges747 silver badges1172 bronze badges

5

Có thể phân tích từng dòng tệp và chỉnh sửa một dòng tại chỗ trong khi đi qua các dòng không?

Đã hỏi ngày 27 tháng 3 năm 2011 lúc 23:39

Blankmanblankman

#!/usr/bin/env python
# grep_some_condition.py
import fileinput

for line in fileinput.input[inplace=True, backup='.bak']:
    if some_condition[line]:
        print line, # this goes to the current file

252K315 Huy hiệu vàng747 Huy hiệu bạc1172 Huy hiệu đồng

$ python grep_some_condition.py first_file.txt second_file.txt

Nó có thể được mô phỏng bằng cách sử dụng tệp sao lưu như mô -đun fileinput của Stdlib.

Dưới đây là một tập lệnh ví dụ loại bỏ các dòng không thỏa mãn some_condition khỏi các tệp được đưa ra trên dòng lệnh hoặc stdin:Mar 28, 2011 at 18:31

2

Thí dụ:

import in_place

with in_place.InPlace['data.txt'] as file:
    for line in file:
        line = line.replace['test', 'testZ']
        file.write[line]

Khi hoàn thành các tệp first_file.txtsecond_file.txt sẽ chỉ chứa các dòng thỏa mãn vị ngữ some_condition[].

  • Đã trả lời ngày 28 tháng 3 năm 2011 lúc 18:31
  • Mô -đun fileinput có API rất xấu xí, tôi tìm thấy mô -đun đẹp cho tác vụ này - in_place, ví dụ cho Python 3:

Sự khác biệt chính so với FileInput::

  1. Thay vì cướp
    $ python grep_some_condition.py first_file.txt second_file.txt
    
    1, một fileHandle mới được trả lại để viết.
  2. FileHandle hỗ trợ tất cả các phương thức I/O tiêu chuẩn, không chỉ
    $ python grep_some_condition.py first_file.txt second_file.txt
    
    2.you lose any line in the file that has not already been re-written.

Ghi chú quan trọng:

Giải pháp này xóa mọi dòng trong tệp nếu bạn không viết lại nó với dòng

$ python grep_some_condition.py first_file.txt second_file.txt
3.16 gold badges44 silver badges62 bronze badges

Ngoài ra, nếu quá trình bị gián đoạn, bạn sẽ mất bất kỳ dòng nào trong tệp chưa được viết lại.Apr 17, 2018 at 8:24

vvvvvAlexey Shrub

19.1K16 Huy hiệu vàng44 Huy hiệu bạc62 Huy hiệu đồng12 silver badges20 bronze badges

0

Đã trả lời ngày 17 tháng 4 năm 2018 lúc 8:24

Cây bụi Alexey

1.12012 Huy hiệu bạc20 Huy hiệu đồngMar 27, 2011 at 23:49

Không. Bạn không thể ghi một cách an toàn vào một tệp bạn cũng đang đọc, vì bất kỳ thay đổi nào bạn thực hiện đối với tệp có thể ghi đè nội dung mà bạn chưa đọc. Để thực hiện nó một cách an toàn, bạn phải đọc tệp vào bộ đệm, cập nhật bất kỳ dòng nào theo yêu cầu, sau đó viết lại tệp.Karl Nicoll

Nếu bạn đang thay thế byte-for-byte nội dung trong tệp [tức là nếu văn bản bạn thay thế có cùng độ dài với chuỗi mới bạn đang thay thế nó], thì bạn có thể thoát khỏi nó, nhưng đó là một hornets Nest, vì vậy tôi sẽ tự lưu cho mình những rắc rối và chỉ đọc toàn bộ tệp, thay thế nội dung trong bộ nhớ [hoặc thông qua một tệp tạm thời] và viết lại.3 gold badges48 silver badges63 bronze badges

0

Đã trả lời ngày 27 tháng 3 năm 2011 lúc 23:49

Karl Nicollkarl Nicoll

15.7k3 Huy hiệu vàng48 Huy hiệu bạc63 Huy hiệu Đồng

Nếu bạn chỉ có ý định thực hiện các thay đổi cục bộ không thay đổi độ dài của phần của tệp được sửa đổi [ví dụ: thay đổi tất cả các ký tự thành chữ thường], thì bạn thực sự có thể ghi đè lên các nội dung cũ của tệp một cách linh hoạt.Mar 28, 2011 at 0:15

Để làm điều đó, bạn có thể sử dụng quyền truy cập tệp ngẫu nhiên với phương thức

$ python grep_some_condition.py first_file.txt second_file.txt
4 của đối tượng
$ python grep_some_condition.py first_file.txt second_file.txt
5.thkala

Ngoài ra, bạn có thể sử dụng đối tượng

$ python grep_some_condition.py first_file.txt second_file.txt
6 để coi toàn bộ tệp như một chuỗi có thể thay đổi. Hãy nhớ rằng các đối tượng
$ python grep_some_condition.py first_file.txt second_file.txt
6 có thể áp đặt giới hạn kích thước tệp tối đa trong phạm vi 2-4 GB trên CPU 32 bit, tùy thuộc vào hệ điều hành của bạn và cấu hình của nó.23 gold badges152 silver badges198 bronze badges

Đã trả lời ngày 28 tháng 3 năm 2011 lúc 0:15

file.seek[offset[, whence]]

Thkalathkala

81.8K23 Huy hiệu vàng152 Huy hiệu bạc198 Huy hiệu đồng

Bạn phải sao lưu theo kích thước của dòng trong các ký tự. Giả sử bạn đã sử dụng

$ python grep_some_condition.py first_file.txt second_file.txt
8, sau đó bạn có thể có được độ dài của dòng và sao lưu bằng cách sử dụng:

Đặt từ

$ python grep_some_condition.py first_file.txt second_file.txt
9, đặt bù thành
import in_place

with in_place.InPlace['data.txt'] as file:
    for line in file:
        line = line.replace['test', 'testZ']
        file.write[line]
0.76 gold badges655 silver badges712 bronze badges

Xem tài liệu Python hoặc nhìn vào trang web cho

import in_place

with in_place.InPlace['data.txt'] as file:
    for line in file:
        line = line.replace['test', 'testZ']
        file.write[line]
1.Mar 27, 2011 at 23:47

KenorbBob

Phù bằng vàng 145K764 silver badges9 bronze badges

Bài Viết Liên Quan

Chủ Đề