Команда sed запускается с использованием os.system () или subprocess.call () оставляет файл csv без разделителя

Я запускаю сценарий Python, который берет дамп CSV из базы данных Postgres, а затем я хочу избежать двойных кавычек во всех этих файлах. Поэтому я использую sed для этого.
В моем коде Python:

sed_for_quotes = 'sed -is/\\"//g /home/ubuntu/PTOR/csvdata1/'+table+'.csv' subprocess.call(sed_for_quotes, shell=True) 

Процесс завершается без какой-либо ошибки, но когда я загружаю эти таблицы в Redshift, я получаю сообщение об ошибке. No delimiter found и после проверки CSV я обнаружил, что одна из строк загружена только наполовину, например, если это столбец временной метки, то загружается только половина из них, и после этого в таблице нет данных (в то время как фактический CSV имеет эти данные перед запуском sed ). И это приводит к ошибке определения No delimiter found

Но когда я запускаю sed -is/\"//g filename.csv для этих файлов в оболочке, он отлично работает, а csv после запуска sed имеет все строки. Я проверил, что нет никаких проблем с данными в файлах ,

В чем причина этого не работает в программе Python? Я также пытался использовать sed -i.bak в программе python, но это не имеет никакого значения.

Обратите внимание, что я использую дополнительную обратную косую черту (\) в коде Python, потому что мне нужно избежать другой обратной косой черты.
Другие подходы пытались :

  • Использование subprocess.Popen без размера буфера и с положительным размером буфера, но это не помогло
  • Использование subprocess.Popen(sed_for_quotes,bufsize=-4096) (отрицательный размер буфера) работал для одного из файлов, которые subprocess.Popen(sed_for_quotes,bufsize=-4096) ошибку, но затем столкнулся с той же проблемой в другом файле.

2 Solutions collect form web for “Команда sed запускается с использованием os.system () или subprocess.call () оставляет файл csv без разделителя”

Не используйте промежуточную оболочку, когда вам это не нужно. И проверьте код возврата подпроцесса, чтобы убедиться, что он успешно завершен ( check_call делает это для вас)

 path_to_file = ... # eg '/home/ubuntu/PTOR/csvdata1/' + table + '.csv' subprocess.check_call(['sed', '-i', 's/"//g', path_to_file]) 

Под «промежуточной» оболочкой я подразумеваю, что процесс оболочки выполняется subprocess который анализирует команду (± разбивается на пробелы, но не только) и запускает ее (в этом примере выполняется sed ). Поскольку вы точно знаете, с какими аргументами следует ссылаться, вам не нужно все это, и лучше избегать этого.

Поместите ваш sed в shell script , например

 #!/bin/bash # Parameter $1 = Filename sed -i 's/"//g' "$1" 

Вызовите shell script с помощью subprocess :

 sed_for_quotes = 'my_sed_script /home/ubuntu/PTOR/csvdata1/'+table+'.csv' 

Использовать docs.python.org/3.6: shlex.split
shlex.split (s, comments = False, posix = True)
Разделите строку s, используя shell-подобный синтаксис.

  • Цитировать Цитировать POSIX shell специальные символы на выходе Python
  • Скрипт для тестирования Mobile-Friendly
  • Когда я запускаю setuptools .egg «как если бы это был сценарий оболочки», что на самом деле происходит?
  • Высокое использование процессора Python
  • как запустить оболочку django с ipython в режиме qtconsole?
  • Сравните файл .txt и .csv и нужно заменить соответствующим именем в файле .csv на .txt
  • Захват SIGINT с использованием исключения KeyboardInterrupt работает в терминале, а не в скрипте
  • Нет графического окна в matplotlib в Linux Shell Windows 10
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.