2011-08-18 50 views
15

Tôi có tệp CSV với dữ liệu đọc mà tôi muốn đọc vào Python. Tôi nhận được danh sách chứa các chuỗi như "2,5". Bây giờ làm float("2,5") không hoạt động, bởi vì nó có dấu thập phân sai.chuyển đổi dấu thập phân

Làm cách nào để đọc điều này vào Python là 2.5?

+0

bạn đã kiểm tra: http://pypi.python.org/pypi/Babel/0.9.6 – mouad

Trả lời

16

float("2,5".replace(',', '.')) sẽ làm trong hầu hết trường hợp

Nếu value là một số lượng lớn và . đã được sử dụng cho hàng ngàn, bạn có thể:

Thay thế tất cả dấu phẩy cho điểm: value.replace(",", ".")

Hủy bỏ tất cả nhưng điểm cuối cùng: value.replace(".", "", value.count(".") -1)

+14

Chỉ cần tò mò, là nó là giải pháp đúng cách? Trông khủng khiếp với tôi. – agibalov

+0

@ loki2302 - Dấu phân tách thập phân chuẩn là một điểm. Nếu bạn sử dụng bất kỳ thứ gì khác (tức là dấu phẩy hoặc cái gì đó "kỳ lạ" như không gian, thư hay bất kỳ thứ gì khác), thì bạn phải thay thế nó để làm cho 'float()' hiểu ý bạn là gì. – eumiro

+0

Dấu phân cách thập phân là vấn đề [nội địa hóa] (http://en.wikipedia.org/wiki/Decimal_point#Hindu-Arabic_numeral_system), vì vậy tôi đoán @ loki2302 sẽ tự hỏi nếu có cách nào để thông báo cho python đến _adhere_ theo cách được bản địa hoá đại diện cho một số dấu phẩy động khi phân tích cú pháp. –

2

Thử thay thế tất cả dấu phẩy thập phân bằng dấu chấm thập phân:

floatAsStr = "2,5" 
floatAsStr = floatAsStr.replace(",", "."); 
myFloat = float(floatAsStr) 

Hàm replace, tất nhiên, hoạt động trên bất kỳ chuỗi con nào như python hiện phân biệt giữa chuỗi ký tự char và chuỗi.

+10

'str' là một tên biến xấu, xấu. – eumiro

+0

bạn là đúng, tôi chỉ cần sao chép mã từ một số trang hướng dẫn và thêm dòng cuối cùng ... – penelope

3

sử dụng một regex sẽ đáng tin cậy hơn

import re 

decmark_reg = re.compile('(?<=\d),(?=\d)') 

ss = 'abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3)' 

print ss 
print decmark_reg.sub('.',ss) 

kết quả

abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3) 
abc , 2.5 def ,5.88 or (2.5, 8.12, 8945.3) 

Nếu bạn muốn để điều trị các trường hợp phức tạp hơn (số không có chữ số trước dấu thập phân cho dụ) regex tôi crafted để phát hiện tất cả các loại số trong chuỗi sau có thể bạn quan tâm:

stackoverflow.com/questions/5917082/regular-expression-to-match-numbers-with-or-without-commas-and-decimals-in-text/5929469

+0

Làm thế nào bạn có thể làm điều này trên một khung dữ liệu gấu trúc (không phải chuỗi)? – hhh

46

Bạn có thể làm điều đó một cách locale-aware:

import locale 

# Set to users preferred locale: 
locale.setlocale(locale.LC_ALL, '') 
# Or a specific locale: 
locale.setlocale(locale.LC_NUMERIC, "en_DK.UTF-8") 

print locale.atof("3,14") 

đọc this phần trước khi sử dụng phương pháp này.

+1

Bạn cũng nên nhớ rằng đây không phải là chủ đề an toàn: http://stackoverflow.com/questions/2186327/thread-safe-locale-techniques –

8

Pandas hỗ trợ ra này của hộp:

df = pd.read_csv(r'data.csv', decimal=',') 

Xem http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

+0

Có một số lệnh sẵn sàng thay thế dấu thập phân bằng dấu chấm thập phân hay không trong gấu trúc (không có vũ phu thay thế bằng một số regex)? – hhh

+0

Không tìm thấy. Nhưng có gì sai khi thay thế nó bằng cách áp dụng hoặc áp dụng bản đồ? – maggie

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