Перейти к содержимому

Main txt что это

  • автор:

Работа с файлами в Python

Загрузить данные в программу из файла, выгрузить данные в файл, записывать историю обращений к программе в специальный файл — всё это очень частые задачи.

Как открыть файл

Чтобы открыть файл, используется функция open() :

my_file = open("myfile.txt", "r") file_contents = my_file.read() my_file.close() 
  • Функция open() принимает на вход 2 аргумента: путь до файла и права, с которыми его открыть. r — от read , т.е. мы просим открыть файл в режиме чтения.
  • Функция open() возвращает не текст в файле, а сам файл. Файл как бы теперь открыт, как если вы бы щёлкнули по нему дважды левой клавишей.
  • Метод файла .read() позволяет читать данные из файла. Строка с содержимым файла запишется в переменную file_contents .
  • Метод .close закрывает файл.

Как сделать правильно

Закрывать файлы важно по двум причинам:

  1. Чтобы читать и писать в один и тот же файл из разных мест программы.
  2. Чтобы не превысить лимиты операционной системы. У неё есть ограничение на число одновременно открытых файлов. Ограничение легко превысить, если открывать файлы в цикле.

Однажды вы точно забудете закрыть файл. В Python есть специальная команда на такой случай — with :

with open("myfile.txt", "r") as my_file: file_contents = my_file.read() print(file_contents) 

Выглядит немного непривычно, но суть простая: всё, что лежит “внутри” блока with (т.е. с отступом от него) — делается с открытым файлом. Как только файл не нужен, вы убираете отступ и файл сам закроется.

Открыть файл в папке

Допустим, рядом c вашим файлом main.py , из которого вы запускаете код, лежит папка files . В этой папке лежит файл file.txt :

. ├── files │ └── file.txt └── main.py 

Вам очень нужно открыть файл file.txt , но он спрятался в папке, что же делать? Вот как его открыть:

with open("files/file.txt", "r") as my_file: file_contents = my_file.read() print(file_contents) 

Ошибки кодировки

Бывает, что вы знаете, что файл в порядке, но Python читает его со странными символами: ������. Дело в кодировках: одни программы пользуют CP1251, другие ASCII, третьи UTF-8. К сожалению, программистам до сих пор не получилось окончательно перейти к какому-то одному варианту.

Чтобы открыть файл с нужной кодировкой, нужно передать функции open именованный аргумент encoding :

with open("myfile.txt", "r", encoding="ваша кодировка") as my_file: # . 

Если вы не знаете кодировку вашего файла, на Хабре есть интересная статья с такой схемой:

Запись в файл

Для записи в файл нужно лишь указать режим w (write) и использовать не .read() , а .write() :

my_text = "Хочу записать эту строку в файл" with open("myfile.txt", "w") as my_file: my_file.write(my_text) 

Альтернативные статьи

  • Python World: работа с файлами
  • Python Scripts: работа с файлами

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Имена файлов передаются через параметры функции main()

Есть текстовый файл содержащий русские и латинские слова. Нужно оставить в нем только те фразы, в которых содержится не менее трех слов. Имена входных файлов передаются программе при ее запуске через параметры функции main(). Если параметры при запуске программы не заданы, имена файлов вводятся с клавиатуры. Предложения может располагаться на нескольких строках, разделяются точками, а слова — пробелами, знаками препинания и символами строки. В конце файла фраза может быть без точки. Вроде код рабочий, но переписывает до какого-то определенного момента и завершается, не могу понять в чем проблема. Еще так понимаю не правильно передаются параметры через функцию main(). Буду признателен, если поможете.

#include #include #include int simb(char *); int main(int argc, char *argv[]) < system("chcp 1251"); FILE * f1, * f2; char c, fname, str[1000], file1[50], file2[50]="t.txt"; int len=0, i=0; while (((f1=fopen("f.txt","r"))==NULL)) < printf("name file: "); fname=fgets(file1,sizeof(file1),f1); if(((f1=fopen(file1,"r"))==NULL)) puts("Error"); >if ((f2 = fopen("t.txt","w")) == NULL) < puts("Error"); system("pause"); >// как-то так надо передавать или по другому? /*if(argc>2) < strcpy(f1,argv[1]); strcpy(f2,argv[2]); >else < strcpy(f1,"f.txt"); strcpy(f2,"t.txt"); */>do < c = fgetc(f1); if((c=='.')||(c==EOF)) < *(str+len) = (c=='.')?'.':' '; *(str+len+1) = '\0'; if(simb(str)) < fputs(str,f2); puts(str); >len=0; > else < *(str+len)=c; len++; >> while(c!=EOF); fclose(f1); fclose(f2); remove("f.txt"); rename("t.txt","f.txt"); return 0; > int simb(char *str) < int i=0, a=0; while(str[i]!='\0') < if((str[i]==' ')||(str[i]==',')||(str[i]==':')||(str[i]==';')||(str[i]=='-')) < a++; >i++; > if(a

Отслеживать
задан 3 дек 2022 в 22:11
7 5 5 бронзовых знаков

Вы правильно начали ( if (argc > 2) ), но копировать argv[1] и argv[2] надо в массивы file1 и file2, а также надо перенести этот код до fopen

4 дек 2022 в 14:25

Не подскажите, что может быть неправильно, если у меня завершается в каком-то определенном месте в файле? Ну или доходит до конца, но в конце не совсем корректно выполняется

4 дек 2022 в 17:52

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вы неправильно считаете количество слов в фразе, почему-то предполагаете, что слова разделены ровно одним разделителем и после последнего слова в фразе тоже должен быть разделитель.

Для подсчета слов нужно отслеживать состояние in_word т.е. текущий символ относится к слову или нет. При переходе от разделителей (пробелы, знаки пунктуации) к другому символу, состояние меняется и счетчик слов увеличивается.

Вот пример такого кода:

#include #include #include #include #include #define IS_DELIM(c) (ispunct(c) || isspace(c)) int main (int ac, char *av[]) < char f1_name[1024], f2_name[1024]; if (ac < 3) < puts("Enter file names:"); if (!fgets(f1_name, 1024, stdin) || !fgets(f2_name, 1024, stdin)) perror("get files\n"), exit(1); f1_name[strlen(f1_name) - 1] = 0; f2_name[strlen(f2_name) - 1] = 0; >else < strcpy(f1_name, av[1]); strcpy(f2_name, av[2]); >printf("input: `%s` output: `%s`\n", f1_name, f2_name); FILE *in = fopen(f1_name, "r"); if (!in) perror(f1_name), exit(2); FILE *out = fopen(f2_name, "w"); if (!out) perror(f2_name), exit(2); int lim = 1000; int in_word = 0; int n_words = 0; char *str = malloc(lim + 3); if (!str) perror("malloc"), exit(3); int len = 0; for (;;) < int c = fgetc(in); if (c == '.' || c == EOF) < // end of phrase if (n_words >2) < if (c == '.') str[len++] = c; str[len] = 0; fputs(str, out); >if (c == EOF) break; n_words = 0; len = 0; in_word = 0; continue; > if (len > lim) if ((str = realloc(str, (lim *= 2) + 3)) == 0) perror("realloc"), exit(3); // accumulate symbols of current phrase and calculate number of words in it str[len++] = c; if (!IS_DELIM(c)) < if (!in_word) n_words++; // first character of the word in_word = 1; // now state is 'in the word' >else // delimiter found, now current state is 'not in the word' in_word = 0; > // end for (;;) fputs("\n", out); // for nicer output, because the last phrase outputs without '\n' fclose(out); return puts("End") == EOF; > 

О возможно незнакомых пока вам функциях (ispunct, isspace, malloc, realloc, exit, perror) прочтите в manpages (например, man ispunct (можно набивать в поисковой строке гугла))

P.S.
Вот фрагмент кода без malloc/realloc, как вы просили в комментарии

. int in_word = 0; int n_words = 0; char str[10000]; int lim = 9998; int len = 0; for (;;) < int c = fgetc(in); if (c == '.' || c == EOF) < // end of phrase if (n_words >2) < if (c == '.') str[len++] = c; str[len] = 0; fputs(str, out); >if (c == EOF) break; n_words = 0; len = 0; in_word = 0; continue; > if (len > lim) fputs("Phrase too long, exited. \n", stderr), exit(3); // accumulate symbols of current phrase and calculate number of words in it str[len++] = c; if (!IS_DELIM(c)) < if (!in_word) n_words++; // first character of the word in_word = 1; // now state is 'in the word' >else // delimiter found, now current state is 'not in the word' in_word = 0; > // end for (;;) . 

Удалить пустые строки с файла в Unix/Linux

Иногда, у нас имеются файлы и в них много пустых строк — это не очень удобно (по крайней мере для чтения). Файлы можно отредактировать вручную, если файл имеет несколько пустых строк, но если файл имеет тысячи пустых строк, это трудно сделать вручную. Используйте один из следующих методов для удаления пустых строк из файла.

-=== СПОСОБ 1 — Использование утилиты SED ===-

Sed потоковый редактор. С помощью этой утилиты, можно легко удалить все пустые строки. Используйте одну из следующих команд sed для удаления пустых строк из файла.

  • main.txt — Это исходный файл, из которого нужно удалить пустые строки.
  • output_file.txt — Будет служить файлом без пустых строк.
# sed '/^$/d' main.txt > out.txt
# sed -i '/^$/d' main.txt

-=== СПОСОБ 2 — Использование perl ===-

И так, чтобы удалить пустые строки в файлу (у меня это main.txt), используйте:

# perl -i -n -e "print if /S/" main.txt

-=== СПОСОБ 3 — Использование утилиты AWK ===-

Используйте команду awk для удаления пустых строк из файла.

  • main.txt — Это исходный файл, из которого нужно удалить пустые строки.
  • output_file.txt — Будет служить файлом без пустых строк.

И так, запускаем:

# awk 'NF > 0' main.txt > out.txt

-=== СПОСОБ 4 — Использование утилиты CAT ===-

Используйте команду cat для удаления пустых строк из файла.

  • main.txt — Это исходный файл, из которого нужно удалить пустые строки.
  • output_file.txt — Будет служить файлом без пустых строк.

И так, запускаем:

$ cat main.txt | grep -Ev "^$" > out.txt

-=== СПОСОБ 5 — Использование утилиты TR ===-

Используйте команду cat для удаления пустых строк из файла.

  • main.txt — Это исходный файл, из которого нужно удалить пустые строки.
  • output_file.txt — Будет служить файлом без пустых строк.
$ tr -s '\n' < main.txt >out.txt

Если появятся еще идеи. Я дополню данную тему!

Вот и все, статья «Удалить пустые строки с файла в Unix/Linux» завершена.

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики

  • Arch Linux (167)
  • Commands (36)
  • Debian’s (635)
    • Administration tools Ubuntu (37)
    • Backups Debian’s (7)
    • Database в Ubuntu (58)
    • Games (игры) (1)
    • Monitoring в Debian и Ubuntu (49)
    • Virtualization в Ubuntu / Debian/ Linux Mint (41)
      • Docker (22)
      • Kubernetes (6)
      • KVM (4)
      • OpenVZ (3)
      • Vagrant (5)
      • VirtualBox (6)
      • ArgoCD (1)
      • Concourse (1)
      • Gitlab (1)
      • Jenkinks (4)
      • Spinnaker (1)
      • Apache (32)
      • Cherokee (1)
      • FTP-services (5)
      • Lighttpd (1)
      • Nginx (26)
      • PHP (27)
      • Proxy для Debian’s (2)
      • Tomcat (4)
      • Панели управления в Ubuntu/Debian/Mint (24)
      • Установка и настройка почты на Ubuntu/Debian (12)
      • Хранилища (clouds) (2)
      • Administration tools freeBSD (19)
      • Database во FreeBSD (52)
      • Monitoring во freeBSD (37)
      • Virtualization во FreeBSD (22)
      • VoIP (1)
      • Установка Web сервисов (91)
      • Установка и настройка почты (6)
      • Установка из ports (пакетов) (19)
      • Установка из sorce code (исходников) (23)
      • Непрерывная интеграция (CI) (27)
      • Database в MacOS (36)
      • Monitoring в Mac OS (31)
      • Security (безопасность) (12)
      • Virtualization в Mac OS (30)
        • Docker (19)
        • Kubernetes (6)
        • Vagrant (5)
        • VirtualBox (5)
        • ArgoCD (1)
        • CircleCI (1)
        • Concourse (1)
        • Gitlab (1)
        • Jenkinks (4)
        • Spinnaker (1)
        • Administration tools CentOS (49)
        • Backups RPM’s (4)
        • Database в CentOS (68)
        • Monitoring в CentOS (67)
        • Virtualization в CentOS/ Red Hat/ Fedora (42)
          • Docker (23)
          • Kubernetes (6)
          • KVM (5)
          • OpenVZ (2)
          • Vagrant (5)
          • VirtualBox (6)
          • VMWare (3)
          • ArgoCD (1)
          • Concourse (1)
          • Gitlab (1)
          • Jenkinks (4)
          • Spinnaker (1)
          • Apache (35)
          • Cherokee (1)
          • DNS (3)
          • FTP (10)
          • Nginx (33)
          • PHP (34)
          • Proxy для RedHat’s (2)
          • Tomcat (2)
          • Voice (2)
          • Панели управления в CentOS/Red Hat/Fedora (27)
          • Прокси сервер на CentOS/RHEL/Fedora (4)
          • Установка и настройка почты на CentOS/RHEL/Fedora (14)
          • Хранилища (clouds) (1)

          соц сети

          Unix-Linux- в примерах

          Unix-Linux- в примерах

          Unix-Linux- в примерах

          Архив новостей

          Свежие записи

          • Pull/Push AWS ECR образов через AWS Route53 CNAME 17.11.2021
          • openpgp: signature made by unknown entity в Terraform 09.11.2021
          • Установка Terraformer в Unix/Linux 31.05.2021
          • Установка ArgoCD в Unix/Linux 06.01.2021
          • Установка tfswitch в Unix/Linux 08.12.2020

          Свежие комментарии

          • Вадим к записи Переключить версию python в Unix/Linux
          • Максим к записи Сохраняем все резервные копии в Dropbox
          • Артём к записи Переключить версию python в Unix/Linux
          • Владислав к записи Добавить Swap в CentOS/Fedora/RedHat
          • Александр к записи Закомментировать/Раскомментировать строки vi/vim в Unix/Linux

          .txt Расширение файла

          Вы здесь, потому у вас есть файл, который имеет расширение файла, заканчивающийся в .txt. Файлы с расширением .txt может быть запущен только некоторыми программами. Вполне возможно, что .txt являются файлами данных, а не документы или средства массовой информации, что означает, что они не предназначены для просмотра на всех.

          что такое&nbsp.txt&nbspфайл?

          Текстовые документы, сохраненные в формате TXT могут быть созданы, открыты и отредактированы с использованием разнообразных программ обработки редактирования и слова текста, разработанных для систем Linux, Microsoft Windows на компьютерах и Mac платформ. Содержание этих .txt файлов не отформатирован ASCII текст, который может быть сохранен как .txt документов в файлы малого размера. Почти все смартфоны в комплекте с приложениями, которые предлагают поддержку совместимости для доступа к содержимому этих файлов TXT, в то время как Kindle устройство от Amazon также может быть использован для открытия и просмотра контента, хранящегося в документе TXT. Популярные редактирования текста приложения Microsoft Windows как Microsoft Notepad может быть использован для создания TXT файлы, и эта программа может использоваться даже для сохранения этих неформатированный текст документов в HTML и форматы JS среди других. Приложение Apple, TextEdit также имеет поддержку для открытия, просмотра и изменения содержимого текстового документа в формате TXT, и эта программа может быть использована также создавать текстовые документы и сохранить его в формате с .txt расширением. Есть много приложений, разработанных для различных дистрибутивов Linux, которые могут создать, открыть и просмотреть текстовое содержание этих .txt файлов, и с этой широкой поддержки перекрестной совместимости, пользователи различных платформ могут поделиться своими TXT документы, скорее всего, не сталкиваясь проблемы или вопросы.

          как открыть .txt файл?

          Запустите .txt файл или любой другой файл на своем компьютере, дважды щелкнув его. Если ваши ассоциации файлов настроены правильно, приложение, которое предназначается, чтобы открыть свой .txt файл будет открыть его. Возможно, вы, возможно, потребуется загрузить или приобрести правильное применение. Кроме того, возможно, что у вас есть правильное применение на вашем компьютере, но .txt Файлы еще не связанные с ним. В этом случае, при попытке открыть .txt файл, вы можете сказать, Окна, какое приложение является правильным для этого файла. С тех пор, открывая .txt файл откроется правильное применение. Нажмите здесь, чтобы исправить ошибки ассоциации .txt файл

          приложения, которые открываются .txt файл

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *