Python: базовые коллекции именованных корней для программистов на VB

#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 , not File , files , not Files ). Первые символы верхнего регистра указывают на тип и переменную.

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’