2009-08-13 38 views
25

Tôi là một Python hoàn chỉnh. Làm thế nào tôi có thể loại bỏ hai ký tự từ đầu mỗi dòng trong một tập tin? Tôi đã cố gắng một cái gì đó như thế này:Cách xóa hai ký tự khỏi đầu dòng

#!/Python26/ 

import re 

f = open('M:/file.txt') 
lines=f.readlines() 

i=0; 
for line in lines: 
    line = line.strip()  
    #do something here 
+3

Bạn nên đọc hướng dẫn (http://docs.python.org/tutorial/). Những gì bạn đang tìm kiếm là đúng trong phần giới thiệu (xem "chuỗi"). – hop

Trả lời

59

Bạn đã có một khởi đầu tốt. Hãy thử điều này trong vòng lặp của bạn:

for line in lines: 
    line = line[2:] 
    # do something here 

Các [2:] được gọi là "slice" cú pháp, nó chủ yếu nói "cho tôi một phần của chuỗi này mà bắt đầu từ chỉ số 2 và tiếp tục cho đến cuối cùng (vì không có kết thúc . điểm đã được chỉ định sau dấu hai chấm)

+5

+1 để cung cấp câu trả lời trong ngữ cảnh của câu hỏi * và * cho giải thích mức độ mới bắt đầu. – mhawke

20

String slicing sẽ giúp bạn:

>>> a="Some very long string" 
>>> a[2:] 
'me very long string' 
0

Chỉ cần sử dụng dòng [2:]

10

Thay vì sử dụng một vòng lặp for, bạn có thể hạnh phúc hơn với aa danh sách hiểu:

[line[2:] for line in lines] 

Cũng giống như một sự tò mò, đừng kiểm tra cut công cụ unix.

$ cut -c2- filename 

Cú pháp cắt cho -c tương đối giống với python's.

10

Cũng giống như một mẹo, bạn có thể rút ngắn chương trình của bạn để

for line in open('M:/file.txt'): 
    line = line[2:] 

Và nếu bạn cần phải mang theo số dòng quá, sử dụng

for i, line in enumerate(open('M:/file.txt.')): 
    line = line[2:] 
3

Nếu bạn muốn thay đổi một nội dung của tệp, không chỉ xử lý chuỗi, hãy thử tham số 's inplace:

# strip_2_chars.py 
import fileinput 
for line in fileinput.input(inplace=1): 
    print line[2:] 

Sau đó, trên dòng lệnh:

python strip_2_chars.py m:\file.txt 
1

Bạn sẽ tìm thấy trăn có một số cách tuyệt vời để đối phó với chuỗi. Một số phương thức chuỗi hữu ích khác mà bạn có thể muốn kiểm tra là các phương thức như split(), replace() và startswith()/endswith().

3

Nó có thể là thú vị khi biết rằng có một sự khác biệt nhưng quan trọng tinh tế giữa:

file = open(filename) 
lines = file.readlines() 
for line in lines: 
    do something 

file = open(filename) 
for line in file: 
    do something 

Các giải pháp đầu tiên (với readlines) sẽ được tải toàn bộ nội dung của tập tin trong bộ nhớ và trả về một danh sách python (của chuỗi). Mặt khác, giải pháp thứ hai sử dụng một thứ gọi là iterator. Điều này sẽ trong thực tế di chuyển con trỏ trong tập tin khi cần thiết và trả về một chuỗi. Điều này có một lợi ích quan trọng: Tệp không được tải vào bộ nhớ. Đối với các tệp nhỏ, cả hai cách tiếp cận đều OK.Nhưng miễn là bạn chỉ làm việc với các tập tin từng dòng, tôi đề nghị sử dụng các hành vi iterator trực tiếp.

Vì vậy, giải pháp của tôi sẽ là:

infile = open(filename) 
outfile = open("%s.new" % filename, "w") 
for line in infile: 
    outfile.write(line[2:]) 
infile.close() 
outfile.close() 

Hãy đến với suy nghĩ của nó: Nếu đó là một tập tin không ascii (ví dụ latin-1 được mã hóa), xem xét sử dụng codecs.open. Nếu không, bạn có thể có một bất ngờ khó chịu vì bạn có thể vô tình cắt một ký tự nhiều byte một nửa;)

Tuy nhiên, nếu bạn không cần python và điều duy nhất bạn cần làm là cắt hai ký tự đầu tiên ra khỏi tệp thì cách hiệu quả nhất để làm điều đó là gợi ý kch và sử dụng cut:

cat filename | cut -d2- > newfile 

Đối với những loại hoạt động tập tin nhanh chóng-và-bẩn tôi luôn luôn có cygwin cài đặt trên boxen phi linux của tôi. Nhưng tôi tin rằng có một tập hợp các cửa sổ nhị phân cho những công cụ này cũng sẽ thực hiện nhanh hơn trong Cygwin iirc.

0

Vì bạn đang học Python, tôi muốn thêm vào đó, với các công cụ được cung cấp bởi Python (cắt, chia, thay thế và tất cả các thứ khác đã được đề cập), bạn sẽ thấy rằng đối với nhiều nhiệm vụ regex là quá mức cần thiết. Vì vậy,

import re 

ở đầu ví dụ của bạn có thể hoặc có thể không cần thiết.

-1

Không hiệu quả lắm nhưng có nó hoạt động. Trông khá phức tạp.

print line[-(len(line)-2):] 
+0

Tại sao chính xác điều này không cung cấp câu trả lời? – JJJ

+0

nó cung cấp câu trả lời chỉ của nó dat nó trông phức tạp –

+0

Hãy giải thích logic khi mã hóa thuần túy được tham gia. Đoạn mã của bạn làm gì và cách giải quyết vấn đề. Kể từ khi OP là mới để python nó sẽ giúp anh ta để hiểu mã tốt hơn. – Jeet

Các vấn đề liên quan