#python #namedtuple
#питон #названный набор
Вопрос:
Я разрабатываю свой первый «Hello World» на Python! Давным-давно я был программистом на Visual Basic…
Я пытаюсь использовать коллекции Namedtuple, как показано ниже:
#!/usr/bin/env python3
import collections
#Tipo da colecao
File = collections.namedtuple('File',['abspath' ,'basename','filextention','filetype'])
Files = []
Files.append(File('/home/user/teste1.txt', 'teste1.txt','txt',''))
Files.append(File('/home/user/teste2.txt', 'teste2.txt','txt',''))
Files.append(File('/home/user/teste3.txt', 'teste2.txt','txt',''))
for lCtd in range(0,len(Files)):
print(Files[lCtd].abspath,Files[lCtd].basename,Files[lCtd].filextention)
for lCtd in range(0,len(Files)):
#>>>>>How can I do this?!<<<<<
Files[lCtd].filetype = 'A'
Если у вас есть лучший способ сделать это (или весь код), я весь внимание…
Большое спасибо!
Комментарии:
1.
namedtuple
s являются неизменяемыми. Вместо этого вы можете попробовать использовать списокdict
s или recordtype .2. Отлично! Как это может работать? Не могли бы вы показать с помощью кода (используя ту же логику, которую я пытаюсь использовать выше)? Я начал в Python в эти выходные … извините
3. Возможно, в VB все по-другому, но в Python очень не рекомендуется, чтобы имена переменных начинались с символов верхнего регистра (
file
, notFile
,files
, notFiles
). Первые символы верхнего регистра указывают на тип и переменную.4. Спасибо @Steve! Мне есть чему поучиться в Python…
Ответ №1:
Именованные кортежи полезны, но они неизменяемы: их атрибуты не могут быть изменены после их создания. Если вам нужен такой же удобный держатель данных, который можно изменять, вас могут заинтересовать классы данных, если вы используете Python 3.7 или новее.
from dataclasses import dataclass
@dataclass
class File:
file_name: str
abs_path: str
base_name: str
file_extension: str
# The '=' below sets a default value. (You could use '', but None is more
# commonly used for this.)
file_type: str = None
files = [
File('/home/user/test1.txt', 'test1.txt', 'txt'),
File('/home/user/test2.txt', 'test2.txt', 'txt'),
File('/home/user/test3.txt', 'test3.txt', 'txt'),
]
for file in files:
print(file.abs_path, file.base_name, file.file_extension)
# This will update the file_type attribute for each file:
file.file_type = 'A'
Обратите внимание, что более питонический способ перебора списка (или любой последовательности) — это не полагаться на len
и индекс, а просто перебирать сами элементы.
Все это говорит о том, что если вы ищете простой способ работы с файлами, например, получение их имен и расширений, вам, вероятно, следует также взглянуть на Pathlib .
from pathlib import Path
file = Path('/home/user/test1.txt')
print(str(file), file.name, file.suffix)
# Output: /home/user/test1.txt test1.txt .txt
PS file
был встроен в Python 2, и многие редакторы все еще могут выделить его как таковой, но его должно быть хорошо использовать в качестве имени переменной / класса в Python 3.
Комментарии:
1. Спасибо! И извините за мои основные вопросы… Я столкнулся с одной проблемой: «из классов данных импортируйте модуль dataclassenotfounderror: нет модуля с именем ‘dataclasses'» У меня CentOS 7… И у меня есть вопрос в коде: я хотел бы обновить тип файла «столбца» в «файлах», и у меня есть вопрос: я хотел бы обновить тип файла «столбца» в «файлах»
2. @Fperuso У вас должна быть более старая версия Python. Вам нужна версия 3.7 или новее. Ввод
python --version
в командной строке должен сообщить вам, что у вас есть. И вы обновляете атрибут («столбец»), просто присваивая ему. Посмотрите на строкуfile.file_type = 'A'
.3. Вы правы! Я использую 2.7.5. Я не знаю, обновлю ли я его, испорчу ли мою ОС
4. Python 2 больше не поддерживается. Вам действительно следует попробовать установить Python 3, если это возможно. (О том, как это сделать, посмотрите здесь на SO или Google, но, вероятно, это довольно просто с менеджером пакетов вашей ОС.)
5. @Fperuso на самом деле Python 2 и Python 3 считаются отдельными программами, поскольку обратной совместимости нет. Я не уверен насчет CentOS, но во многих дистрибутивах Linux параллельно установлены Python 2 и 3. Попробуйте ввести
python3 -v
, чтобы проверить, установлен ли Python 3 и какая версия. Обратите внимание, что у вас могут быть некоторые системные приложения в зависимости от конкретной версии Python. Перед обновлением вам следует проверить форумы Google и CentOS. Кроме того, CentOS является отдельным дистрибутивом и не рекомендуется для использования на рабочем столе. Если вы можете выбрать, попробуйте последнюю версию Ubuntu.
Ответ №2:
Похоже, что вы действительно хотите здесь определить свой собственный класс, например:
class File:
# make a constructor, with a default parameter (for convenience!)
def __init__(self, abspath, basename, filextention, filetype = ''):
self.abspath = abspath
self.basename = basename
self.filextention = filextention
self.filetype = filetype
Files = []
# this part is almost the same, but you don't need the last parameter
# because we gave it a default value
Files.append(File('/home/user/teste1.txt', 'teste1.txt','txt'))
Files.append(File('/home/user/teste2.txt', 'teste2.txt','txt'))
Files.append(File('/home/user/teste3.txt', 'teste2.txt','txt'))
# this is a better way to loop over a list in Python:
for curFile in Files:
print(curFile.abspath, curFile.basename, curFile.filextention)
for curFile in Files:
curFile.filextention = 'A' # in Python all fields are public by default and can be assigned like this
Комментарии:
1. Возможно ли, что одно «поле» моего файла класса может находиться в другом классе? abspath базовое имя filextention тип файла image (созданный данными, размер)
2. для curFile в файлах: curFile.filextention = ‘A’ Когда я это делаю, я меняю значения в «Files class»?
3. @Fperuso 1. Я не понимаю ваш первый вопрос. 2.
Files
является списком Pyhton. У негоfilextention
нет и не может быть поля. Но последние две строки кода представляют собой цикл, который перебирает всеFile
объекты в этом списке и изменяетfilextention
каждый объект по отдельности. Если вы хотите изменить только один из них, сделайте что-то вроде этого безfor
: `Files[0].filextention = ‘B’