2012-02-06 20 views
10

Tôi là người mới sử dụng Python và tôi tìm cách phân tích cú pháp tệp .txt. tập tin .txt của tôi là một namelist với thông tin tính toán như:Phân tích cặp giá trị khóa trong một tệp văn bản

myfile.txt

var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920

Cách đọc các giá trị và đặt chúng trong myvar0, myvar1, myvar2, myvar3 trong python?

Trả lời

36

Tôi đề nghị lưu trữ các giá trị trong một cuốn từ điển thay vì trong các biến địa phương riêng biệt:

myvars = {} 
with open("namelist.txt") as myfile: 
    for line in myfile: 
     name, var = line.partition("=")[::2] 
     myvars[name.strip()] = float(var) 

Bây giờ truy cập chúng như myvars["var1"]. Nếu tên là tất cả các tên biến python hợp lệ, bạn có thể đặt như sau:

names = type("Names", [object], myvars) 

và truy cập các giá trị như ví dụ: names.var1.

+0

Trong trường hợp của tôi, ông sử dụng dải() trên tên là dư thừa, nhưng dòng mới trên var gây ra một vấn đề. Vì vậy, những gì làm việc tốt hơn cho tôi là myvars [name] = float (var.strip()) – snow6oy

+0

điều gì sẽ xảy ra nếu nhận xét của tệp cas '# đây là dòng nhận xét' –

11

Hãy thử python tiêu chuẩn mô-đun configparser

+1

LƯU Ý: configparser ném một 'MissingSectionHeaderError' nếu tập tin không chứa tiêu đề mục và gương OP của không không có tiêu đề. Giải pháp tùy chỉnh của @Lauritz có lẽ đơn giản hơn [cách giải quyết có thể sử dụng configparser không có tiêu đề] (http://stackoverflow.com/questions/22501121/configparser-missingsectionheadererror-when-parsing-rsyncd-config-file-with -glob) – 7yl4r

1

Như @kev đề xuất, mô-đun configparser là cách để đi.

Tuy nhiên trong một số tình huống (một chút xấu xí, tôi thừa nhận) nhưng rất đơn giản và hiệu quả để thực hiện việc này là để đổi tên myfile.txt-myfile.py và làm một from myfile import * (sau khi bạn khắc phục lỗi đánh máy var 0 ->var0)

Tuy nhiên, đây là rất không an toàn, vì vậy nếu tệp từ nguồn bên ngoài hoặc có thể được viết bởi kẻ tấn công độc hại, hãy sử dụng điều gì đó xác thực dữ liệu thay vì thực thi nó một cách mù quáng.

0

Nếu có nhiều giá trị bằng dấu phẩy trên một dòng duy nhất, đây là mã để phân tích mà ra:

res = {}                                                

    pairs = args.split(", ")                                            
    for p in pairs:                                              
     var, val = p.split("=")                                           
     res[var] = val                                             
Các vấn đề liên quan