Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2021 23:48:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Antonpython
Что я только не крутил - выводит один раз цифру 1. Но заголовков несколько.
Это не CSV-формат. Это модифицированный CSV-формат.
rfc. CSV

Питон как раз знает, где CSV-формат, а где не CSV-формат. Питон умеет работать и с модифицированным CSV-форматом, но ему нужно сообщить об этом.

Antonpython
Ну, у меня он цсв формат. Поверьте.
https://perso.telecom-paristech.fr/eagan/class/igr204/datasets

Вот для этого файла код
  
#!/usr/bin/env python3
 
# Добавляет колонку идентификаторов в файл данных в модифицированном
# CSV-формате
 
import csv
 
ifname = r'cars.csv'
ofname = r'cars_out.csv'
 
with open(ifname, 'r', newline='') as csvin, \
     open(ofname, 'w', newline='') as csvout:
    reader = csv.DictReader(csvin, delimiter=';')
    iheaders = reader.fieldnames
    oheaders = ['Id'] + iheaders
    writer = csv.DictWriter(csvout, delimiter=';', fieldnames=oheaders)
    writer.writeheader()
    for i, row in enumerate(reader):
        if i == 0:
            row['Id'] = None
            writer.writerow(row) # можно закомментировать
        else:
            row['Id'] = i
            writer.writerow(row)

Приложил ещё сами файлы.



Отредактировано py.user.next (Март 9, 2021 23:51:26)

Прикреплённый файлы:
attachment csvcars.tar.gz (9,5 KБ)

Офлайн

#2 Март 10, 2021 19:32:54

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Перекроил, чтобы лучше понять, спасибо за примеры, как писать более продвинуто

У меня получилось следующее:

 import csv, os
def get_list_from_csv(file):
  values = []
  with open(file) as csv_file:
    reader = csv.reader(csv_file, delimiter=';')
    for row in reader:
      values.append(row)
  return values
def get_column(table:list, column:int):
  value_from_column = []
  for row in table:
    value_from_column.append(row[column])
  return value_from_column
def get_splitted_values(value_list):
    temp = []
    for i in value_list:
        elementList = i.split(',')
        temp.append(elementList[0])
    return list(temp)
def get_sorted_values(value_list):
    elements = sorted(value_list, key=lambda v: v[1])
    return list(elements)
def get_unique_values(value_list):
    res = [] 
    [res.append(x) for x in value_list if x not in res] 
    return res
def set_id_for_value(value_list):
    temp = enumerate(value_list)
    return list(temp)
def write_elements_to_csv(value_list):
    temp = set(value_list)
    with open("D:\\proc\\onlycars.csv", "w", newline='') as file:
        writer = csv.writer(file, delimiter=',')
        writer.writerows(temp)
csv_rows_in_list = get_list_from_csv("D:\\proc\\cars.csv")
for i in range(5):
    print(csv_rows_in_list[i])
print("--------------")
allElements = get_column(csv_rows_in_list, 0)
for i in range(5):
    print(allElements[i])
print("--------------")
splited_values = get_splitted_values(allElements)
for i in range(5):
    print(splited_values[i])
print("--------------")
sorted_vaues = get_sorted_values(splited_values)
for i in range(5):
    print(sorted_vaues[i])
print("--------------")
unique_values = get_unique_values(sorted_vaues)
for i in range(5):
    print(unique_values[i])
print("--------------")
with_id_values = set_id_for_value(unique_values)
for i in range(5):
    print(with_id_values[i])
print("--------------")
write_elements_to_csv(with_id_values)

При принте печатает отсортированно:

 --------------
(0, 'AMC Rebel SST')
(1, 'AMC Ambassador DPL')
(2, 'AMC Rebel SST (sw)')
(3, 'AMC Hornet')
(4, 'BMW 2002')
--------------
Но при записи в сам файлик - пишет как-то вот так:
 188,Dodge Colt Hardtop
107,Chrysler Cordoba
209,Volkswagen Dasher
157,Oldsmobile Omega Brougham
8,AMC Ambassador SST

Не могу догадаться в чем проблема…можете подсказать?

Офлайн

#3 Март 10, 2021 20:09:40

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

 write_elements_to_csv(with_id_values)

здесь ты готовый список отдаешь команде “записать_элемент_в _csv(вместе_ID_значение)”

 def write_elements_to_csv(value_list):
    temp = set(value_list)# здесь твой сортированый список становиться кортежем,в нем элементы как попало, поэтому value_list записывай сразу
    with open("D:\\proc\\onlycars.csv", "w", newline='') as file:
        writer = csv.writer(file, delimiter=',')
        writer.writerows(value_list)# вот здесь value_list, делай везде print() где хочешь отследить в каком виде данные

Офлайн

#4 Март 11, 2021 08:57:10

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Внес ченджи
Поменял сортировку с 1 на 0
Нумерацию с 1
и то, что подсказали с нюансом по кортежу.

Сработало. Наконец-то. Благодарю.

 import csv
def get_list_from_csv(file):
  values = []
  with open(file) as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
      values.append(row)
  return values
def get_column(table:list, column:int):
  value_from_column = []
  for row in table:
    value_from_column.append(row[column])
  return value_from_column
def get_splitted_values(value_list):
    temp = []
    for i in value_list:
        elementList = i.split(',')
        temp.append(elementList[0])
    return list(temp)
def get_sorted_values(value_list):
    elements = sorted(value_list, key=lambda v: v[0])
    return list(elements)
def get_unique_values(value_list):
    res = [] 
    [res.append(x) for x in value_list if x not in res] 
    return res
def set_id_for_value(value_list):
    temp = enumerate(value_list,1)
    return list(temp)
def write_elements_to_csv(value_list):
    # temp = set(value_list)
    with open("D:\\out\\onlycars.csv", "w", newline='') as file:
        writer = csv.writer(file, delimiter=',')
        writer.writerows(value_list)
csv_rows_in_list = get_list_from_csv("D:\\out\\cars.csv")
for i in range(5):
    print(csv_rows_in_list[i])
print("--------------initial")
allElements = get_column(csv_rows_in_list, 0)
for i in range(7):
    print(allElements[i])
print("--------------unpacked")
splited_values = get_splitted_values(allElements)
for i in range(7):
    print(splited_values[i])
print("--------------splitted[i]")
sorted_vaues = get_sorted_values(splited_values)
for i in range(7):
    print(sorted_vaues[i])
print("--------------sorted")
unique_values = get_unique_values(sorted_vaues)
for i in range(7):
    print(unique_values[i])
print("--------------unique")
with_id_values = set_id_for_value(unique_values)
for i in range(7):
    print(with_id_values[i])
print("--------------readytoWrite")
write_elements_to_csv(with_id_values)

Осталось только теперь такое сделать правильно для каждой колонки
Какой здесь паттерн может подойти или он здесь не нужен?

Хотел бы попробовать цепочку ответственности?

Офлайн

#5 Март 11, 2021 10:07:10

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Еще перекроил
Не вижу нюанса -

 runfile('D:/scripts/ParseByColumns.py', wdir='D:/scripts')
Traceback (most recent call last):
  File "D:\scripts\ParseByColumns.py", line 56, in <module>
    allElements = get_column(csv_rows_in_list, counter)
  File "D:\scripts\ParseByColumns.py", line 23, in get_column
    value_from_column.append(row[column])
IndexError: list index out of range


Делает одну итерацию, как я хочу
На второй, видимо, падает.
Ставлю красную точку: брейк в spyder, чтобы разобраться - компилятор его глотает и не останавливается?
Я поэтому не могу посмотреть, что происходит.

Подскажите, пожалуйста, где нюанс, вроде все правильно.
Да и не знаю пока, как дважды не обращаться к файлу, чтобы получить заголовки. Как-то некрасиво. Как это обойти, тоже не знаю.


 import csv
def get_headers_of_the_file(file):
    with open(file, 'r', newline='') as csvfile:
     reader = csv.DictReader(csvfile)
     headers = reader.fieldnames
     for i in headers:
         elementList = i.split(',')#здесь обязательно должна быть запятая
    return elementList
def get_list_from_csv(file):
  values = []
  with open(file) as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
      values.append(row)
  return values
def get_column(table:list, column:int):
  value_from_column = []
  for row in table:
    value_from_column.append(row[column])
  return value_from_column
def get_splitted_values(value_list, column:int):
    temp = []
    for i in value_list:
        elementList = i.split(',')
        temp.append(elementList[column])
    return list(temp)
def get_sorted_values(value_list):
    elements = sorted(value_list, key=lambda v: v[0])
    return list(elements)
def get_unique_values(value_list):
    res = [] 
    [res.append(x) for x in value_list if x not in res] 
    return res
def set_id_for_value(value_list):
    temp = enumerate(value_list,1)
    return list(temp)
def write_elements_to_csv(value_list, header):
    # temp = set(value_list) because this is tuple - would not sort
    with open(f"D:\\out\\{header}.csv", "w", newline='') as file:
        writer = csv.writer(file, delimiter=',')
        writer.writerows(value_list)
csvHeaders = get_headers_of_the_file("D:\\out\\cars.csv")
counter = 0
for i in csvHeaders:
    csv_rows_in_list = get_list_from_csv("D:\\out\\cars.csv")
    allElements = get_column(csv_rows_in_list, counter)
    splited_values = get_splitted_values(allElements, counter)
    sorted_vaues = get_sorted_values(splited_values)
    unique_values = get_unique_values(sorted_vaues)
    with_id_values = set_id_for_value(unique_values)
    write_elements_to_csv(with_id_values, i)
    counter = counter + 1

Отредактировано Antonpython (Март 11, 2021 10:13:27)

Офлайн

#6 Март 11, 2021 10:55:10

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Проблема была здесь, но я до конца не понял, почему.

 def get_column(table:list, column:int):
  value_from_column = []
  for row in table:
    value_from_column.append(row[0])
  return value_from_column

Офлайн

#7 Март 11, 2021 11:01:21

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Вообще так, но осталось заголовки добавить

 import csv
def get_headers_of_the_file(file):
    with open(file, 'r', newline='') as csvfile:
     reader = csv.DictReader(csvfile)
     headers = reader.fieldnames
     for i in headers:
         elementList = i.split(',')#здесь обязательно должна быть запятая
    return elementList
def get_list_from_csv(file):
  values = []
  with open(file) as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
      values.append(row)
  return values
def get_column(table:list, column:int):
  value_from_column = []
  for row in table:
    value_from_column.append(row[0])
  return value_from_column
def get_splitted_values(value_list, column:int):
    temp = []
    for i in value_list:
        elementList = i.split(',')
        temp.append(elementList[column])
    return list(temp)
def get_sorted_values(value_list, counter):
    elements = sorted(value_list, key=lambda v: v[0])
    return list(elements)
def get_unique_values(value_list):
    res = [] 
    [res.append(x) for x in value_list if x not in res] 
    return res
def set_id_for_value(value_list):
    temp = enumerate(value_list,1)
    return list(temp)
def write_elements_to_csv(value_list, header):
    # temp = set(value_list) because this is tuple - would not sort
    with open(f"D:\\out\\{header}.csv", "w", newline='') as file:
        writer = csv.writer(file, delimiter=',')
        writer.writerows(value_list)
csvHeaders = get_headers_of_the_file("D:\\out\\cars.csv")
counter = 0
csv_rows_in_list = get_list_from_csv("D:\\out\\cars.csv")
for i in csvHeaders:
    allElements = get_column(csv_rows_in_list, counter)
    splited_values = get_splitted_values(allElements[2:], counter)
    sorted_vaues = get_sorted_values(splited_values, counter)
    unique_values = get_unique_values(sorted_vaues)
    with_id_values = set_id_for_value(unique_values)
    write_elements_to_csv(with_id_values, i)
    counter = counter + 1

Офлайн

#8 Март 11, 2021 11:22:25

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

def write_elements_to_csv(value_list, header):
with open(f"D:\\out\\{header}.csv", "w", newline='') as file:
fieldnames = ['Id', header]
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
counter = 1
for row in value_list:
writer.writerow({'Id': counter, header: row[header]})
counter = counter + 1

Не получается. Пишет только заголовки.
Так же сортирует цифры, как строки при записи. Это касательно цифр с повышенной точностью.
Ну, и

AMC Rebel SST
AMC Ambassador DPL
AMC Rebel SST (sw)
AMC Hornet
Audi 100 LS
AMC Gremlin
AMC Matador
AMC Hornet Sportabout (sw)
AMC Ambassador SST
AMC Matador (sw)
AMC Ambassador Brougham
Audi 100LS
Audi Fox
AMC Pacer
AMC Pacer d/l
AMC Concord
AMC Concord d/l
Audi 5000
AMC Concord DL 6
AMC Spirit DL
Audi 4000
Audi 5000s (diesel)
AMC Concord DL

вместо
 AMC Ambassador Brougham
AMC Ambassador DPL
AMC Ambassador SST
AMC Concord
AMC Concord d/l
AMC Concord DL
AMC Concord DL 6
AMC Gremlin
AMC Hornet
AMC Hornet Sportabout (sw)
AMC Matador
AMC Matador (sw)
AMC Pacer
AMC Pacer d/l
AMC Rebel SST
AMC Rebel SST (sw)
AMC Spirit DL
Audi 100 LS
Audi 100LS
Audi 4000
Audi 5000
Audi 5000s (diesel)
Audi Fox


То есть сортировка…
Как-то…

Как можно улучшить? или подскажете, куда копать?

Отредактировано Antonpython (Март 11, 2021 12:22:51)

Офлайн

#9 Март 11, 2021 15:13:58

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

Честно сказать, ну, и форматов наплодили. Сейчас пришлось решение корректировать под условно правильный формат. На примере titanic.csv Все заработало. С небольшими унаследованными недоработками.

Попробовал на pandas. Куда более просто делается первая итерация.
Но я думаю, на чистом python тоже хорошо немного поучиться, что-то поделать.

Офлайн

#10 Март 12, 2021 08:19:42

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вывести номера для каждого значения в массиве

вчера делал тесты

Я с этим скриптом я смог сделать обработки только на 60 000 строк.
Дальше - бессмысленно - ничего не происходило, процессило на получении уникальных значений.
С пандас я подошел аккуратно - сначала срезал 100 000, потом 1000000
Сработало за 20 секунд
Отдал все
это 3.6 гига строк. Сколько не считал.
запроцесило за 50 секунд
офигеть
Я в шоке.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version