Найти - Пользователи
Полная версия: Чтение чисел разного формата из csv-файла
Начало » Python для новичков » Чтение чисел разного формата из csv-файла
1
ivan812
Добрый день, друзья!

Есть csv-файл.
В нем могут быть числа разного формата (зависит от локали того кто сохранял файл)
Могут быть варинаты:

1,343,456.00
1.343.456.00
1,343,456,00
1 343 456.00
1343456.00
1343456

Можно ли стандратными средствами перевести такую строку в число?
Или только самому парсить строку (регуляркой)?

Подскажите плиз
ZerG
можно убрать все точки и запятые в принцыпе и работать как с иинтом
а на выводе если надо уже делить правильно
разумеется это если все данные однотипные
к примеру
12,3 + 1,2 совершенно не тоже самое что 1,23 + 1,2
Но в вашем примере 1,343,456,00 и 1.343.456.00 и 134345600
ivan812
ZerG
можно убрать все точки и запятые в принцыпе и работать как с иинтом а на выводе если надо уже делить правильно разумеется это если все данные однотипные к примеру 12,3 + 1,2 совершенно не тоже самое что 1,23 + 1,2Но в вашем примере 1,343,456,00 и 1.343.456.00 и 134345600

Да, десятичные могут быть, не обязательно .00
То есть, стандартных функций для этого нет? Только самому обрабатывать такие записи чесел?
FishHook
ivan812
То есть, стандартных функций для этого нет?
Да тут разговоров больше чем кода понадобится

 from itertools import dropwhile
   
s = [
'.03',
'1,343,456.03',
'1.343.456.04   ',
'1,343,456,05',
'1 343 456.06',
'1343456.03',
'1343456'
]
   
def normalize(str_val):
    str_val = str_val.strip()
    try:
        sep = dropwhile(lambda x: x not in ",.", str_val[::-1]).next()
        h, t = str_val.rsplit(sep, 1)
        h = (h or "0").replace(" ", "")\
                      .replace(",", "")\
                      .replace(".", "")
        return float(h + "." + t)
    except StopIteration:
        return float(str_val)
  
for i in s:
    print(normalize(i))
ZerG
зависит от локали того кто сохранял файл
Вобще это корень проблемы! Она вылезет потом еще и не в одном месте.

Вы же на заправляете бензиновый автомобиль соляркой или ракетным топливом (в зависимости от того что под рукой)?
ivan812
FishHook

Спасибо за пример!

Вопрос то был не в том что сложно самому написать, а возможно есть стандартный способ о котором я незнаю, возможно мои примеры не покрывают все возможные варанты форматов чисел.

Видимо нет такого способа, придется самому преобразовывать.
py.user.next
ivan812
Есть csv-файл.
Файлы csv обрабатываются модулем csv. Какие там числа и в каком формате - это не важно. Если это csv он может быть разобран только одним способом - по спецификации csv-формата.

И вот когда ты их разобрал (распарсил), тогда у тебя есть список списков строк. И вот дальше эти строки ты можешь преобразовывать, как тебе надо. Ну, если тебе надо числа к единому виду привести, то ты пишешь функцию для обработки такой строки, в которой число в каком-то формате. И эта функция и должна знать, как число в любом формате привести к одному и тому же виду и вернуть такой результат.

ivan812
Могут быть варинаты:
1,343,456.00
1.343.456.00
1,343,456,00
1 343 456.00
1343456.00
1343456
Вот функция должна принимать строку, менять её как-то, переводить в число и возвращать это число.

Просто csv тут вообще ни при чём, все действия должны делаться уже после разбора, который выполняется единственным способом.
doza_and
ivan812
То есть, стандартных функций для этого нет? Только самому обрабатывать такие записи чесел?

Это не так. Стандартный способ есть.

В стандарте csv не определено понятие числа. Поэтому в общем случае число там сохранить нельзя и все ваши потуги на ваш страх и риск :).

Более того, csv это comma separated. И запятые в числах должны трактоваться как разделители полей.

Если вы хотите передавать числа, передавайте их в форматах которые предусматривают понятие целого и плавающего числа. К таковым относятся json, yaml, msgpack, protobuf, hdf5 и т.п. тогда никаких проблем с этим не будет.

Можно оставить tsv. Но тогда надо написать валидатор и не принимать данные в неправильном формате. Кто неправильно делает тот пускай на это и тратит время.

Если не можете на это повлиять, сами напишите экспортировщик, который будет делать экспорт единообразно, и именно в нем локализуйте особенности экспорта.

Я подозреваю откуда ваша проблема. Тут уже упоминалась ссылка https://habrahabr.ru/company/mailru/blog/129476/. Можете дать почитать тем кто делает экспорт.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB