Files
2024-05-26 20:35:16 +08:00

4.4 KiB

Documentation

WAS_Text_Save节点旨在管理将文本数据保存到文件的过程。它处理目录的创建,检查空文本,并生成具有适当填充和分隔符的文件名。节点确保保存的文件具有唯一名称并存储在指定的路径中。

Input types

Required

  • text
    • 文本参数代表打算保存到文件的文本内容。它是节点操作的基础部分,因为它是正在管理的主要数据。
    • Comfy dtype: STRING
    • Python dtype: str
  • path
    • 路径参数指定将保存文本文件的目录。它对于确定文件在文件系统中的位置至关重要。
    • Comfy dtype: STRING
    • Python dtype: str

Optional

  • filename_prefix
    • 文件名前缀参数设置文件名的起始字符。它有助于保存文件的唯一性和组织性。
    • Comfy dtype: STRING
    • Python dtype: str
  • filename_delimiter
    • 文件名分隔符参数定义用于分隔文件名前缀和数字部分的字符。它有助于区分文件名的不同部分。
    • Comfy dtype: STRING
    • Python dtype: str
  • filename_number_padding
    • 文件名数字填充参数确定用于文件名数字部分的位数。它确保文件名的格式一致。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • text
    • 文本输出参数返回保存到文件的文本,提供已写入数据的确认。
    • Comfy dtype: STRING
    • Python dtype: str
  • ui
    • ui输出参数用于提供用户界面反馈。它通常包含已保存文本的字符串表示。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: Dict[str, str]

Usage tips

  • Infra type: CPU

Source code

class WAS_Text_Save:

    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(cls):
        return {'required': {'text': ('STRING', {'forceInput': True}), 'path': ('STRING', {'default': './ComfyUI/output/[time(%Y-%m-%d)]', 'multiline': False}), 'filename_prefix': ('STRING', {'default': 'ComfyUI'}), 'filename_delimiter': ('STRING', {'default': '_'}), 'filename_number_padding': ('INT', {'default': 4, 'min': 2, 'max': 9, 'step': 1})}}
    OUTPUT_NODE = True
    RETURN_TYPES = ()
    FUNCTION = 'save_text_file'
    CATEGORY = 'WAS Suite/IO'

    def save_text_file(self, text, path, filename_prefix='ComfyUI', filename_delimiter='_', filename_number_padding=4):
        tokens = TextTokens()
        path = tokens.parseTokens(path)
        filename_prefix = tokens.parseTokens(filename_prefix)
        if not os.path.exists(path):
            cstr(f"The path `{path}` doesn't exist! Creating it...").warning.print()
            try:
                os.makedirs(path, exist_ok=True)
            except OSError as e:
                cstr(f'The path `{path}` could not be created! Is there write access?\n{e}').error.print()
        if text.strip() == '':
            cstr(f'There is no text specified to save! Text is empty.').error.print()
        delimiter = filename_delimiter
        number_padding = int(filename_number_padding)
        file_extension = '.txt'
        filename = self.generate_filename(path, filename_prefix, delimiter, number_padding, file_extension)
        file_path = os.path.join(path, filename)
        self.writeTextFile(file_path, text)
        update_history_text_files(file_path)
        return (text, {'ui': {'string': text}})

    def generate_filename(self, path, prefix, delimiter, number_padding, extension):
        pattern = f'{re.escape(prefix)}{re.escape(delimiter)}(\\d{{{number_padding}}})'
        existing_counters = [int(re.search(pattern, filename).group(1)) for filename in os.listdir(path) if re.match(pattern, filename)]
        existing_counters.sort(reverse=True)
        if existing_counters:
            counter = existing_counters[0] + 1
        else:
            counter = 1
        filename = f'{prefix}{delimiter}{counter:0{number_padding}}{extension}'
        while os.path.exists(os.path.join(path, filename)):
            counter += 1
            filename = f'{prefix}{delimiter}{counter:0{number_padding}}{extension}'
        return filename

    def writeTextFile(self, file, content):
        try:
            with open(file, 'w', encoding='utf-8', newline='\n') as f:
                f.write(content)
        except OSError:
            cstr(f'Unable to save file `{file}`').error.print()