Hướng dẫn python write lines from one file to another - python viết dòng từ tệp này sang tệp khác

Như @ajon đã chỉ ra, tôi không nghĩ có bất cứ điều gì sai về cơ bản với mã của bạn ngoại trừ thụt lề. Với thụt lề cố định, nó hoạt động cho tôi. Tuy nhiên, có một vài cơ hội để cải thiện.

1) Trong Python, cách lặp đi lặp lại tiêu chuẩn trên mọi thứ là bằng cách sử dụng vòng lặp

for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0. Khi sử dụng vòng lặp
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0, bạn không cần xác định các biến đếm vòng lặp và theo dõi chính chúng để lặp lại mọi thứ. Thay vào đó, bạn viết một cái gì đó như thế này
In Python, the standard way of iterating over things is by using a
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 loop. When using a
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 loop, you don't need to define loop counter variables and keep track of them yourself in order to iterate over things. Instead, you write something like this

for line in lines:
    print line

Để lặp lại tất cả các mục trong một danh sách các chuỗi và in chúng.

2) Trong hầu hết các trường hợp, đây là những gì các vòng

for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 của bạn sẽ trông như thế nào. Tuy nhiên, có những tình huống mà bạn thực sự muốn theo dõi số lượng vòng lặp. Trường hợp của bạn là một tình huống như vậy, bởi vì bạn không chỉ cần một dòng đó mà cả ba dòng tiếp theo, và do đó cần sử dụng bộ đếm để lập chỉ mục (
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
3). Đối với đó, có
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
4, sẽ trả về một danh sách các mục và chỉ mục của chúng mà sau đó bạn có thể lặp.
In most cases this is what your
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 loops will look like. However, there's situations where you actually do want to keep track of the loop count. Your case is such a situation, because you not only need that one line but also the next three, and therefore need to use the counter for indexing (
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
3). For that there's
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
4, which will return a list of items and their index over which you then can loop.

for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]

Nếu bạn theo dõi thủ công bộ đếm vòng như trong ví dụ của bạn, có hai điều:

3)

for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
5 nên được chuyển ra khỏi các khối
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
6 và
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
7. Bạn đang làm điều đó trong cả hai trường hợp, vì vậy hãy đặt nó sau
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
8. Trong trường hợp của bạn, khối
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
7 thì không còn làm gì nữa và có thể bị loại bỏ:
That
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
5 should be moved out of the
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
6 and
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
7 blocks. You're doing it in both cases, so put it after the
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
8. In your case the
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
7 block then doesn't do anything any more, and can be eliminated:

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1

4) Bây giờ, điều này sẽ gây ra

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
0 với các tệp ngắn hơn 500 dòng. Thay vì mã hóa cứng số lượng vòng 500, bạn nên sử dụng độ dài thực tế của chuỗi bạn lặp đi lặp lại.
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
1 sẽ cung cấp cho bạn độ dài đó. Nhưng thay vì sử dụng vòng lặp
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
2, hãy sử dụng vòng lặp
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 và
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
4 để lặp qua danh sách phạm vi từ 0 đến
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
5.
Now, this will cause an
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
0 with files shorter than 500 lines. Instead of hard coding a loop count of 500, you should use the actual length of the sequence you're iterating over.
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
1 will give you that length. But instead of using a
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
2 loop, use a
for i, line in enumerate(lines):
    print i
    print line
    print lines[i+7]
0 loop and
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
4 to iterate over a list of the range from zero to
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
5.

for i in range(len(lst)):
    print lst[i]

5)

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
6 có thể được sử dụng như một trình quản lý ngữ cảnh chăm sóc các tệp đóng cho bạn. Các nhà quản lý bối cảnh là một khái niệm khá tiên tiến nhưng khá đơn giản để sử dụng nếu chúng đã được cung cấp cho bạn. Bằng cách làm một cái gì đó như thế này
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
6 can be used as a context manager that takes care of closing files for you. context managers are a rather advanced concept but are pretty simple to use if they're already provided for you. By doing something like this

with open('test.txt') as f:
    f.write('foo')

Tệp sẽ được mở và truy cập cho bạn dưới dạng

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
7 bên trong khối
while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
8 đó. Sau khi bạn rời khỏi khối, tệp sẽ tự động đóng, vì vậy bạn không thể quên đóng tệp.

Trong trường hợp của bạn, bạn đang mở hai tập tin. Điều này có thể được thực hiện bằng cách chỉ sử dụng hai câu lệnh

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
8 và làm tổ chúng

with open('one.txt') as f1:
    with open('two.txt') as f2:
        f1.write('foo')
        f2.write('bar')

hoặc, trong Python 2.7 / Python 3.x, bằng cách làm tổ hai trình quản lý bối cảnh trong một câu lệnh

while i < 500:
    if Lines[i] == searchquery:
        f2.write(Lines[i])
        f2.write(Lines[i+1])
        f2.write(Lines[i+2])
    i = i+1
8:

    with open('one.txt') as f1, open('two.txt', 'a') as f2:
        f1.write('foo')
        f2.write('bar')

6) Tùy thuộc vào hệ điều hành, tệp được tạo trên, các kết thúc dòng là khác nhau. Trên các nền tảng giống như UNIX, đó là

for i in range(len(lst)):
    print lst[i]
1, MAC trước khi OS X sử dụng
for i in range(len(lst)):
    print lst[i]
2 và Windows sử dụng
for i in range(len(lst)):
    print lst[i]
3. Do đó
for i in range(len(lst)):
    print lst[i]
4 sẽ không khớp với kết thúc dòng MAC hoặc Windows.
for i in range(len(lst)):
    print lst[i]
5 có thể đối phó với cả ba, nhưng vì nó giữ bất kỳ kết thúc dòng nào ở cuối dòng, việc so sánh sẽ thất bại. Điều này được giải quyết bằng cách sử dụng
for i in range(len(lst)):
    print lst[i]
6, sẽ loại bỏ chuỗi của tất cả khoảng trắng ở đầu và cuối, và so sánh một mẫu tìm kiếm mà không có dòng kết thúc với điều đó:
Depending on the operating system the file was created on, line endings are different. On UNIX-like platforms it's
for i in range(len(lst)):
    print lst[i]
1, Macs before OS X used
for i in range(len(lst)):
    print lst[i]
2, and Windows uses
for i in range(len(lst)):
    print lst[i]
3. So that
for i in range(len(lst)):
    print lst[i]
4 will not match for Mac or Windows line endings.
for i in range(len(lst)):
    print lst[i]
5 can deal with all three, but because it keeps whatever line endings were there at the end of the line, the comparison will fail. This is solved by using
for i in range(len(lst)):
    print lst[i]
6, which will strip the string of all whitespace at the beginning and the end, and compare a search pattern without the line ending to that:

searchquery = 'am'
# ...
            if line.strip() == searchquery:
                # ...

(Đọc tệp bằng cách sử dụng

for i in range(len(lst)):
    print lst[i]
7 và sử dụng
for i in range(len(lst)):
    print lst[i]
8 sẽ là một lựa chọn khác.)

Nhưng, vì bạn đã đề cập đến chuỗi tìm kiếm của bạn thực sự xuất hiện ở đầu dòng, hãy làm điều đó, bằng cách sử dụng

for i in range(len(lst)):
    print lst[i]
9:

if line.startswith(searchquery):
    # ...

7) Hướng dẫn kiểu chính thức cho Python, PEP8, khuyến nghị sử dụng

with open('test.txt') as f:
    f.write('foo')
0 cho các lớp,
with open('test.txt') as f:
    f.write('foo')
1 cho hầu hết mọi thứ khác (biến, chức năng, thuộc tính, phương thức, mô -đun, gói). Vì vậy, thay vì
with open('test.txt') as f:
    f.write('foo')
2 sử dụng
with open('test.txt') as f:
    f.write('foo')
3. Đây chắc chắn là một điểm nhỏ so với những người khác, nhưng vẫn đáng để nhận được ngay từ sớm.
The official style guide for Python, PEP8, recommends to use
with open('test.txt') as f:
    f.write('foo')
0 for classes,
with open('test.txt') as f:
    f.write('foo')
1 for pretty much everything else (variables, functions, attributes, methods, modules, packages). So instead of
with open('test.txt') as f:
    f.write('foo')
2 use
with open('test.txt') as f:
    f.write('foo')
3. This is definitely a minor point compared to the others, but still worth getting right early on.


Vì vậy, xem xét tất cả những điều tôi sẽ viết mã của bạn như thế này:

searchquery = 'am'

with open('Test.txt') as f1:
    with open('Output.txt', 'a') as f2:
        lines = f1.readlines()
        for i, line in enumerate(lines):
            if line.startswith(searchquery):
                f2.write(line)
                f2.write(lines[i + 1])
                f2.write(lines[i + 2])

Như @tomk đã chỉ ra, tất cả mã này giả định rằng nếu chuỗi tìm kiếm của bạn khớp với nhau, có ít nhất hai dòng sau đó. Nếu bạn không thể dựa vào giả định đó, hãy xử lý trường hợp đó bằng cách sử dụng khối

with open('test.txt') as f:
    f.write('foo')
4 như @poorsod được đề xuất là cách đúng đắn.

Làm cách nào để sao chép một dòng từ tệp này sang tệp khác trong Python?

Phương thức SOWN.Copy () trong Python được sử dụng để sao chép nội dung của tệp nguồn vào tệp hoặc thư mục đích.shutil. copy() method in Python is used to copy the content of the source file to destination file or directory.

Làm thế nào để bạn đọc một dòng trong một tệp và ghi vào một tệp khác trong Python?

Đọc từng dòng..
Mở File1, có nội dung ở chế độ đọc ..
Mở File2 ở chế độ viết ..
Sử dụng cho trong vòng lặp để đi qua mọi dòng trong File1 và ghi vào File2 ..
Nội dung được ghi vào File2 ..
Đóng cả hai tệp ..

Làm thế nào để bạn ghi vào một tệp trong một tệp khác trong Python?

Chương trình Python để sao chép một tệp sang một tệp khác..
Mở một tập tin gọi là Test.txt trong chế độ đọc ..
Mở một tập tin khác ra.TXT trong chế độ ghi ..
Đọc từng dòng từ tệp đầu vào và ghi nó vào tệp đầu ra ..

Làm thế nào để bạn viết vào một dòng tệp từng dòng trong Python?

Phương thức writeLines () Viết danh sách các chuỗi vào một tệp cùng một lúc ...
Đầu tiên, hãy mở tệp văn bản để viết (hoặc nối) bằng hàm Open () ..
Thứ hai, ghi vào tệp văn bản bằng phương thức write () hoặc writeLines () ..
Thứ ba, đóng tệp bằng phương thức đóng () ..