2013-02-13 36 views
10

Tôi vừa bắt đầu sử dụng PyYAML để chuyển đổi một số dữ liệu.Vô hiệu hóa chuyển đổi giá trị PyYAML

Tôi chỉ sử dụng chức năng yaml.load và nó đủ tốt cho tôi cho đến khi tôi nhận thấy rằng nó cố gắng chuyển đổi tất cả các giá trị thành chuỗi, int, ngày tháng, v.v.

Điều này có thể gây tử vong trong đơn đăng ký của tôi, có cách nào để tránh chuyển đổi này không? Tôi muốn nhận mọi thứ dưới dạng chuỗi. Tôi đã xem xét các nhà xây dựng và không thể tìm thấy cách để vô hiệu hóa chuyển đổi này.

cập nhật: Những gì tôi nhận được từ yaml.loadOrderedDict và mọi thứ đều tốt. vấn đề duy nhất là một số giá trị là chuỗi và một số là int. Tôi muốn có tất cả các giá trị như chuỗi. Tôi không muốn pyyaml ​​chuyển đổi các giá trị cho tôi.

+0

Sau đó, bạn không giải mã YAML. Bên cạnh đó, ** chính xác ** bạn muốn để lại là chuỗi và những gì không? Nếu bạn để lại * mọi thứ * một chuỗi, bạn muốn 'the_file.read()' ;-) – delnan

+0

Tệp tôi đang sử dụng pyyaml ​​để phân tích cú pháp thực sự không phải là yaml nhưng nó đủ gần. Vì vậy, tôi muốn tránh loại chuyển đổi. – theAlse

+0

Nhưng * loại * chuyển đổi loại nào? Bạn có muốn nhận danh sách không? Từ điển? Bạn có muốn booleans được chuyển đổi? Nổi? Chiều sâu tùy ý hoặc với định dạng cố định? Khi nó đứng, đây là cách quá quy định. – delnan

Trả lời

22

Vâng, bạn có thể sử dụng Loader=yaml.BaseLoader rời tất cả mọi thứ như là một chuỗi:

>>> x = [[1,2,3], {1:2}] 
>>> s = yaml.dump(x) 
>>> s 
'- [1, 2, 3]\n- {1: 2}\n' 
>>> yaml.load(s) 
[[1, 2, 3], {1: 2}] 
>>> yaml.load(s, Loader=yaml.BaseLoader) 
[[u'1', u'2', u'3'], {u'1': u'2'}] 
+1

Hãy coi chừng: trong khi điều này vô hiệu hóa việc chuyển đổi giá trị tự động, nó cũng làm cho khóa kết hợp "<<" không còn hoạt động trên nhiều mức đơn (tức là "<<" - kết hợp một nút neo mà chính nó cũng "<< "-merges các nút neo khác sẽ không còn hoạt động nữa - được thử nghiệm trên PyYAML 3.10 và 3.11 – voetsjoeba

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