2013-03-11 23 views
14

Tôi muốn sao chép một số dòng văn bản nhất định từ một tệp văn bản này sang một tệp văn bản khác. Trong kịch bản hiện tại của tôi khi tôi tìm kiếm một chuỗi nó sao chép tất cả mọi thứ sau đó, làm thế nào tôi có thể sao chép chỉ là một phần nhất định của văn bản? Ví dụ. chỉ sao chép dòng khi nó có "test/file/myword" trong đó?Sao chép từ một tệp văn bản này sang một tệp văn bản khác bằng cách sử dụng Python

mã hiện tại:

#!/usr/bin/env python 
f = open('list1.txt') 
f1 = open('output.txt', 'a') 

doIHaveToCopyTheLine=False 

for line in f.readlines(): 

    if 'tests/file/myword' in line: 
     doIHaveToCopyTheLine=True 

    if doIHaveToCopyTheLine: 
     f1.write(line) 

f1.close() 
f.close() 
+0

@AshwiniChaudhary không ngại gắn cờ những câu hỏi này với chất lượng thấp. –

+2

hoặc .. tốt hơn ... chỉ cần nhấp vào 'chỉnh sửa'. –

+0

Sự cố với mã của bạn: bạn phải đặt lại cờ trên mỗi lần lặp của vòng lặp. – ATOzTOA

Trả lời

44

Các oneliner:

open("out1.txt", "w").writelines([l for l in open("in.txt").readlines() if "tests/file/myword" in l]) 

Đề xuất với with:

with open("in.txt") as f: 
    lines = f.readlines() 
    lines = [l for l in lines if "ROW" in l] 
    with open("out.txt", "w") as f1: 
     f1.writelines(lines) 

Sử dụng ít bộ nhớ:

with open("in.txt") as f: 
    with open("out.txt", "w") as f1: 
     for line in f: 
      if "ROW" in line: 
       f1.write(line) 
+0

cool! đó là mùi phong cách chức năng 101% :) –

+0

@ATOzTOA cảm ơn bạn đã viết mã và giải thích vấn đề. – DevCon

+2

Thumbs down cho tôi ... mã này tạo ra một danh sách thứ hai trước khi viết. Nó không thể mở rộng. Không được sử dụng readlines() hoặc danh sách thứ hai để tạo danh sách thứ hai. – tdelaney

4

readlines() đọc toàn bộ tệp đầu vào vào danh sách và không phải là biểu diễn tốt. Chỉ cần lặp qua các dòng trong tệp. Tôi đã sử dụng 'with' trên output.txt để nó tự động đóng khi hoàn tất. Điều đó không cần thiết đối với 'list1.txt' vì nó sẽ bị đóng khi vòng lặp for kết thúc.

#!/usr/bin/env python 
with open('output.txt', 'a') as f1: 
    for line in open('list1.txt'): 
     if 'tests/file/myword' in line: 
      f1.write(line) 
3

Chỉ cần làm sạch một chút để làm điều này. Điều này không có nhiều hoặc ít hiệu quả hơn câu trả lời của ATOzTOA, nhưng không có lý do gì để làm hai câu riêng biệt với các câu lệnh.

with open(path_1, 'a') as file_1, open(path_2, 'r') as file_2: 
    for line in file_2: 
     if 'tests/file/myword' in line: 
      file_1.write(line) 
-1
f = open('list1.txt') 
f1 = open('output.txt', 'a') 

# doIHaveToCopyTheLine=False 

for line in f.readlines(): 
    if 'tests/file/myword' in line: 
     f1.write(line) 

f1.close() 
f.close() 

Bây giờ Mã của bạn sẽ làm việc. Hãy thử cái này.

0

an toàn và bộ nhớ tiết kiệm:

with open("out1.txt", "w") as fw, open("in.txt","r") as fr: 
    fw.writelines(l for l in fr if "tests/file/myword" in l) 

Nó không tạo ra danh sách tạm thời (những gì readline[] sẽ làm gì, đó là một tổ chức phi khởi động nếu tập tin là rất lớn), tất cả được thực hiện với máy phát điện sự hiểu biết và sử dụng các khối with đảm bảo rằng các tệp được đóng khi thoát.

0

với mở ("list1.txt") như f: doIHaveToCopyTheLine = False '' 'tập tin đầu ra mở trong chế độ ghi' '' với mở ("output.txt", 'w') như f1: '' 'lặp từng dòng' '' cho dòng trong f: nếu 'kiểm tra/file/myword' phù hợp: doIHaveToCopyTheLine = True elif doIHaveToCopyTheLine: f1.write (line)

f1. close() f.close()