Ну, вы не определили csv_list
в своем коде. Быстро просматривая ваш код, я думаю, что изменение us_csv_file.sort(key=lambda x: csv_list.index(x[1]))
на us_csv_file.sort(key=lambda x: csv_file.index(x[1]))
(т. Е. С использованием правильного имени переменной, которое равно csv_file
, а не csv_list
), может просто решить проблему.
Вот новая попытка. Этот пытается извлечь числа из второго столбца из hostnum.csv и помещает их в отдельный список, который затем использует для сортировки элементов. Когда я запускаю этот код, я получаю ValueError: '025' is not in list
, но я предполагаю, что это потому, что вы не дали нам все файлы, и в действительности нет такой строки, которая бы содержала name025.a.a
в фрагменте hostnum.csv, который вы нам дали, я также добавили [1:]
в оператор сортировки.
Если это не сработает, попробуйте удалить [1:]
и изменить csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0])
на csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0].zfill(4))
. string.zfill(4)
добавит нули в начало строки так долго, что ее длина будет не менее 4.
Поскольку ваш отсортированный файл содержит на один ноль больше, чем несортированный файл, я также изменил
from matplotlib import pyplot as plt
import numpy as np
import csv
csv_file = []
csv_file_numbers = []
##with open('hostnum.csv', 'r') as f:
## csvreader = csv.reader(f, dialect="excel-tab")
## for line in csvreader:
## csv_file.append(line)
## csv_file_numbers.append(line[-1][4:].split('.')[0])
with open('hostnum.csv', 'r') as f:
sorted_raw = f.read()
for line in sorted_raw.splitlines():
csv_file.append(line.split('\t'))
csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0])
us_csv_file = []
with open('unsorted.csv', 'r') as f:
csvreader = csv.reader(f)
for line in csvreader:
us_csv_file.append(line)
us_csv_file.sort(key=lambda x: csv_file_numbers.index(x[1][1:]))
plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csvfile)), [item[0] for item in csvfile])
plt.show()
Этот работал на моем компьютере:
from matplotlib import pyplot as plt
import numpy as np
import csv
csv_file = []
csv_file_dict = {}
##with open('hostnum.csv', 'r') as f:
## csvreader = csv.reader(f, dialect="excel-tab")
## for line in csvreader:
## csv_file.append(line)
## csv_file_numbers.append(line[-1][4:].split('.')[0])
with open('hostnum.csv', 'r') as f:
sorted_raw = f.read()
for line in sorted_raw.splitlines():
csv_file.append(line.split('\t'))
csv_file_dict[csv_file[-1][-1][:-1]] = int(csv_file[-1][0][1:])
us_csv_file = []
with open('unsorted.csv', 'r') as f:
csvreader = csv.reader(f)
for line in csvreader:
us_csv_file.append(line)
us_csv_file.sort(key=lambda x: csv_file_dict[x[0]])
plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csv_file)), [item[0] for item in csv_file])
plt.show()
Итак, теперь я создал dict, в котором значения индекса хранятся в виде значений, а имена каждой ячейки, которые находятся в обоих файлах, в качестве ключей. Я также удалил цитаты вручную, так как по какой-то причине csv.reader
, похоже, делал это неправильно, по крайней мере, он не обрабатывал вкладки нужным образом. Как я написал в одном из моих комментариев, я не знаю почему, наверняка, я предполагаю, что это потому, что цитаты не закрыты в ячейках файла. Во всяком случае, я решил разделить каждую строку вручную с помощью string.split('\t').
Кроме того, вы пропустили подчеркивание в имени переменной csv_file
в нескольких местах в конце, поэтому я добавил их.