2016-09-15 33 views
0

我正在讀取一個csv文件,並且所有行都包含字符串元素。一個可能是:將數據集列表的某些元素轉換爲浮點數

"orange", "2", "65", "banana" 

我想改變這一點,我的數據集內,成爲:

row = ["orange", 2.0, 65.0, "banana"] 

這裏是我的代碼:

data = f.read().split("\n") 
for row in data: 
    for x in row: 
     if x.isdigit(): 
      x = float(x) 
    print row 

但它仍然打印原始行像:

"orange", "2", "65", "banana" 

我也想交流請不要使用列表解析(現在)。

回答

1

我相信這是因爲你不能像這樣編輯行數組。 x變量實際上並不是指數組中的元素,而是其中的一個副本,因此在迭代完數組後,所做的所有更改都會蒸發掉。

我不知道這是否是這樣做的地道的「巨蟒方式」,但你可以這樣做:

data = f.read().split("\n") 
for row in data: 
    parsed_row = [] 
    for x in row: 
     if x.isdigit(): 
      x = float(x) 
     parsed_row.append(x) 
    print parsed_row 

或者更「Python化」的方式,由JGreenwell在給予,可如果一個元素不能被解析爲浮動,則允許拋出異常。

data = f.read().split("\n") 
for row in data: 
    parsed_row = [] 
    for x in row: 
     try: 
      parsed_row.append(float(x)) 
     except ValueError: 
      parsed_row.append(x) 
    print parsed_row 

這真的會歸結爲我個人的偏好,我想象。 Python例外不應該很慢,所以我不會擔心這一點。

+0

這是OP的問題,Pythonic的方式可能是「更好地請求原諒而非許可」成語。意思是使用try/except塊:'除了ValueError之外,'try:parsed_row.append(float(x)):parsed_row.append(x)' - 此方法[顯示在此](http://stackoverflow.com/a/20929983/4667934),但其他答案顯示了取決於某些要求的各種方法 – JGreenwell

0

也許是你的分隔符。嘗試類似

with open('yourfile.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    for row in reader: 
     for x in row: 
      if x.isdigit(): 
       print(float(x)) 
相關問題