Для начала, я программировал на C++ последние полтора года, и это первый раз, когда я использую Python.
У объектов есть два атрибута int, скажем, i_ и j_.
Текстовый файл выглядит следующим образом:
1,0
2,0
3,1
4,0
...
Я хочу, чтобы список был заполнен объектами с правильными атрибутами. Например,
print(myList[2].i_, myList[2].j_, end = ' ')
вернется
3 1
Вот моя попытка после небольшого чтения в Интернете.
class myClass:
def __init__(self, i, j):
self.i_ = i
self.j_ = j
with open("myFile.txt") as f:
myList = [list(map(int, line.strip().split(','))) for line in f]
for line in f:
i = 0
while (i < 28):
myList.append(myClass(line.split(","), line.split(",")))
i +=1
Но это явно не работает.
Заранее спасибо!
@vash_the_stampede да, я не правильно вставил, в моем коде отступ!
Что вы пытаетесь сделать с while (i < 28):
. Почему 28?
Извините @slider, забыл упомянуть. Размер списка должен быть 29, потому что так сказано в нашем задании. Всего 29 объектов. Думаю, я мог бы использовать while! Eof или что-то в этом роде, но суть моего вопроса в том, что я не могу разделить первое число и второе число, разделенные запятой, и поместить их в соответствующие атрибуты объектов в списке.
Я не уверен, что вы пытаетесь сделать с myList = [list(map(int, line.strip().split(','))) for line in f]
. Это даст вам список списков с этими парами, преобразованными в целые числа. Но вам действительно нужны предметы из этих чисел. Итак, давайте сделаем это напрямую, когда мы перебираем строки в файле и покончим со следующим циклом while:
my_list = []
with open("myFile.txt") as f:
for line in f:
nums = [int(i) for i in line.strip().split(',') if i]
if len(nums) >= 2:
my_list.append(myClass(nums[0], nums[1]))
Привет, это здорово! но получаю: ValueError: not enough values to unpack (expected 2, got 1)
@PersiaShahdi, есть ли в файле строка не типа 1,0
?
Есть такие строки, как 1,2,18
, разделенные пустой строкой. Но разве это не приведет к появлению ошибки expected 2, got 3
?
@PersiaShahdi хорошо, тогда давайте будем очень защищаться и рассматривать только строки с номерами >= 2
(см. Обновленный ответ).
Я не уверен, что вы действительно хотите придерживаться этого формата
print(myList[2].i_, myList[2].j_, end = ' ')
Мое решение написано вручную, и я использую словарь для хранения i и j
result = {'i':[],
'j':[]}
и ниже мой код
result = {'i':[],
'j':[]}
with open('a.txt', 'r') as myfile:
data=myfile.read().replace('\n', ',')
print(data)
a = data.split(",")
print (a)
b = [x for x in a if x]
print(b)
for i in range( 0, len(b)):
if i % 2 == 0:
result['i'].append(b[i])
else:
result['j'].append(b[i])
print(result['i'])
print(result['j'])
print(str(result['i'][2])+","+ str(result['j'][2]))
Результат: 3,1
Поскольку вы работаете с файлом CSV, вы можете использовать модуль csv
. Сначала вы передадите объект файла функции csv.reader
, и она вернет итерацию строк из файла. Оттуда вы можете преобразовать его в список и разделить его на 29 строк, которые вам необходимы. Наконец, вы можете перебирать строки (например, [1,0]) и просто распаковывать их в конструкторе класса.
class MyClass:
def __init__(self, i, j):
self.i = int(i)
self.j = int(j)
def __repr__(self):
return f"MyClass(i = {self.i}, j = {self.j})"
with open('test.txt') as f:
rows = [r.strip().split(',') for r in f.readlines()[:29]]
my_list = [MyClass(*row) for row in rows]
for obj in my_list:
print(obj.i, obj.j)
print(len(my_list))
Привет, спасибо за ответ! К сожалению, мы не можем прикоснуться к базе данных, и это файл .txt, поэтому мне приходится с ним работать.
База данных не используется. Вы имеете в виду, что не можете использовать стандартную библиотеку?
Я обновил пример, чтобы использовать только встроенные функции.
Прошу прощения, если я неправильно понял, но вы написали: with open ('csv1.csv') as f: Я имел в виду, что у меня нет файла .csv, у меня есть файл .txt, который я не могу коснуться (или превратить как-нибудь в файл csv) извините, если я что-то не понял
CSV - это текстовый файл. Просто измените имя файла на собственное имя файла, он все равно будет работать.
Это сработало отлично. Спасибо большое за вашу помощь!
Ваш
def
нуждается в отступе