2014-04-09 2 views
0

Я использую считыватель csv-файлов python для чтения файла csv. Мой код выглядит следующим образом:Python CSV-читатель файлов: формат плохих ячеек для больших чисел

with open(self.csv_file, 'rb') as csvfile: 
     data = list(csv.reader(csvfile, delimiter=';')) 

Все работает отлично, за исключением одного столбца моего файла csv. У меня есть столбцы с номерами с плавающей запятой, которые находятся между 1 и -1 (например: 0,34430203959), и он отлично работает, но один из моих столбцов имеет дело с очень большими числами (например: 142266963436). Поскольку ячейки файла отформатированы как "стандарты", мой файл CSV будет printig номер 142266963436 в 142.266.963.436 (как показано на рисунке ниже):

enter image description here

Существует проблема. Когда я разбираю свой файл CSV, у него нет проблем с небольшими номерами, потому что есть только один «.». но когда я разбираю большие числа с большим количеством "." python интерпретирует их как «float» и ставит «.». после первого номера.

Таким образом, вместо того, чтобы номер:

142266963436 

У меня есть номер:

1.42266963436 

Каждый имеет представление о том, как я мог это исправить?

Благодарим за помощь!

+1

Я предполагаю, что вы находитесь в зоне евро-типа, где '.' является разделителем тысяч чисел? –

+0

Нет, Python никогда бы этого не сделал; здесь есть и другая путаница. Python считывает данные только как * строки *. Можете ли вы показать нам 'repr()' оскорбительного столбца, пожалуйста? –

+4

И не путайте, что будет отображать Excel с тем, что на самом деле хранится в CSV-файле на диске. –

ответ

2

В вашем CSV-файле содержится эта странность; похоже, что все ваши столбцы z страдают (ankle_pos.z и toe_pos.z на скриншоте). Если вы уверены, что эти значения предназначены для поплавков, то вы можете использовать Python для «ремонта» эти:

import csv 

def repaired_float(c): 
    try: 
     return float(c) 
    except ValueError: 
     # interpret ddd.ddd.ddd.ddd as 0.ddddddddd instead 
     return float('.{}'.format(c.replace('.', '')) 

with open(filename, 'rb') as infh: 
    reader = csv.reader(infh) 
    next(reader, None) # skip header row 
    for row in reader: 
     row = map(repaired_float, row) 
     # do something with row 

Если вы хотите, чтобы интерпретировать эти значения как (большие) целые числа заменить последние 2 строк в repaired_float() с :

# interpret ddd.ddd.ddd.ddd as ddddddddd instead 
return int(c.replace('.', '')) 
Смежные вопросы