2016-07-15 4 views
-2

Я написал программу, которая читает файл CSV и выводит содержимое в качестве вставных операторов. Затем я написал программу выполнения, в которой должен взять вывод программы анализатора CSV и записать его в .txt-файл, но вместо того, чтобы писать весь вывод, он записывает только первый оператор.Запись вывода программы Python в файл .txt

Вот код для исполнителя:

import sys 

with open('insert.txt', 'wb') as f: 
    subprocess.check_call(["python", "CSVParserMultiple.py"], stdout=f) 

И код парсера:

import csv, os 

path = 'C:/Users/user/Desktop/test/' 
for file in os.listdir(path): 
    if file.endswith('.csv'): 
# print ('Parsing file: ' + os.path.basename(path + file)) 
     openFile = open(path + file) 
     csvFile = csv.reader(openFile) 
     getHeader = next(csvFile) 
     columnHeaders = map((lambda x: "'" + x + "'"), getHeader[:-1]) 
     insert = 'INSERT INTO testing (' + "'ID', 'VehicleID', " + ', '.join(columnHeaders) + ') VALUES ' 
     for row in csvFile: 
      values = map((lambda x: "'" + x.strip() + "'"), row[:-1]) 
      print (insert + "(" + ", ".join(values) + ");") 
     openFile.close() 

Я не совсем уверен, что это имеет смысл, чтобы иметь их как две отдельные программы но я не мог заставить их работать как определенные функции в одной программе для жизни меня. Как я могу заставить программу выполнения выводить все строки программы парсера вместо одной строки? И как я могу объединить их в одну программу?

+0

Вы должны поместить эти операции в функции. Если вы хотите иметь возможность повторно использовать модули и вызывать их из других сценариев, вам необходимо установить их, создав пакет/модуль python. –

+1

Вызов файла python через подпроцесс довольно нелепо. Не делай этого. Если вам нужно * отделить его, а другая функция недостаточно хороша, создайте [собственный модуль] (https://docs.python.org/3/tutorial/modules.html) –

+1

Не уверен почему в выходном файле появляется только первая строка. Но чтобы объединить два сценария, просто поместите оператор 'with open' во второй скрипт, а затем используйте' f.write ('something \ n') 'вместо' print'. –

ответ

0

Вы делаете вещи более сложными, чем они должны быть. Просто вставьте свои открытые заявления, используя с. Одна программа. И он печатает на экране и записывает в файл.

import csv, os 

path = 'C:/Users/user/Desktop/test/' 
for file in os.listdir(path): 
    if file.endswith('.csv'): 
     # print ('Parsing file: ' + os.path.basename(path + file)) 
     with open(path + file) as infile: 
      with open(path+file+".txt",'w') as outfile: 
       csvFile = csv.reader(infile) 
       getHeader = next(csvFile) 
       columnHeaders = map((lambda x: "'" + x + "'"), getHeader[:-1]) 
       insert = 'INSERT INTO testing (' + "'ID', 'VehicleID', " + ', '.join(columnHeaders) + ') VALUES ' 
       for row in csvFile: 
        values = map((lambda x: "'" + x.strip() + "'"), row[:-1]) 
        print (insert + "(" + ", ".join(values) + ");") 
        outfile.write(insert + "(" + ", ".join(values) + ");" + "\n") 
+0

Две небольшие ошибки, иначе это именно то, что я искал. Первым из них является изменение 'с открытым (путь + файл +" .txt ") в качестве outfile:' to 'с open (путь + файл +" .txt "," w ") в качестве файла outfile:', чтобы разрешить права на запись. И второе заключается в том, что правильный вывод отображается в оболочке, но в файле .txt только заголовок печатается без последующих значений. Я не совсем уверен, как это исправить, но большое спасибо за помощь. – ThoseKind

+0

Возможно, у вас возникла проблема с оператором «,» .join, если ваши значения являются числовыми, а не строковыми. Я бы распечатал «row» и «values», чтобы увидеть, идет ли конверсия так, как ожидалось. И я бы использовал тестовый файл, в котором было всего 5 строк данных. Таким образом, любые сообщения об ошибках не будут потеряны из-за прокрутки. – WombatPM

+0

'print (row)' показывает, что каждое из значений действительно является строками (например, '' 11: 47''), хотя они содержат числа. 'print (values)' приводит к '<объекту карты в 0x0000000000003289845>'. Я не уверен, что это значит, но, увидев, что оператор '(insert +" ("+", ".join (values) +"); ")' корректно выводится в оболочке, я бы предположил, что значения 'row' и' 'работают правильно. Ошибка должна быть в самом '.write' (будь то синтаксис, хотя я скопировал его точно из инструкции' print' или что-то еще) или в '' '' ', который определяет' outFile' выше. – ThoseKind

0

Не уверен, что это сработает для вас, но вы можете использовать оператор>/>> для перенаправления stdout в файл.

Edit: Разница между> и >> >> что присоединяет к концу файла, а> обрезает файл

$python program.py >> output.txt 

Чтобы объединить программы, которые вы могли бы иметь программу ИСПОЛНИТЕЛЬ быть определен в качестве основной функции, определив его как

def main(): 
    <executor code here> 
if __name__ == "__main__": 
    main() 

Затем вы можете перенаправить стандартный вывод в файл с помощью

sys.stdout = open("file",'w') 

Похожий вопрос: Redirect stdout to a file in Python?

Смежные вопросы