Форум сайта python.su
AntonpythonЭто не CSV-формат. Это модифицированный CSV-формат.
Что я только не крутил - выводит один раз цифру 1. Но заголовков несколько.
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)
Прикреплённый файлы:
csvcars.tar.gz (9,5 KБ)
Офлайн
Перекроил, чтобы лучше понять, спасибо за примеры, как писать более продвинуто
У меня получилось следующее:
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
Офлайн
write_elements_to_csv(with_id_values)
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() где хочешь отследить в каком виде данные
Офлайн
Внес ченджи
Поменял сортировку с 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)
Офлайн
Еще перекроил
Не вижу нюанса -
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
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)
Офлайн
Проблема была здесь, но я до конца не понял, почему.
def get_column(table:list, column:int): value_from_column = [] for row in table: value_from_column.append(row[0]) return value_from_column
Офлайн
Вообще так, но осталось заголовки добавить
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
Офлайн
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)
Офлайн
Честно сказать, ну, и форматов наплодили. Сейчас пришлось решение корректировать под условно правильный формат. На примере titanic.csv Все заработало. С небольшими унаследованными недоработками.
Попробовал на pandas. Куда более просто делается первая итерация.
Но я думаю, на чистом python тоже хорошо немного поучиться, что-то поделать.
Офлайн
вчера делал тесты
Я с этим скриптом я смог сделать обработки только на 60 000 строк.
Дальше - бессмысленно - ничего не происходило, процессило на получении уникальных значений.
С пандас я подошел аккуратно - сначала срезал 100 000, потом 1000000
Сработало за 20 секунд
Отдал все
это 3.6 гига строк. Сколько не считал.
запроцесило за 50 секунд
офигеть
Я в шоке.
Офлайн