Найти - Пользователи
Полная версия: Как каждую колонку сохранить в отдельный файл?
Начало » Python для новичков » Как каждую колонку сохранить в отдельный файл?
1 2
Antonpython
Всем привет. Падает:

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
                 
         headers = reader.fieldnames
         
         for h in headers:             
             fieldnames = ['', str(h)]         
             writer = csv.DictWriter(os.path.join(out_file,str(h),".csv"), fieldnames=fieldnames)
             counter = 1
             writer.writeheader()
             for row in reader:
                 writer.writerow({'': counter, str(h): row[str(h)]})
                 counter +=1
    #close the files
    csvfile.close()
    out_file.close()

Подскажите, пожалуйста, что я делаю не так и как сделать?


Пишет

 take_head_of_file_four()
Traceback (most recent call last):
  File "<ipython-input-36-91a8e40fd006>", line 1, in <module>
    take_head_of_file_four()
  File "D:\scripts\Cleancsv.py", line 111, in take_head_of_file_four
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\", "w", newline='') as out_file:
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\proc\\'
py.user.next
  
ifname = r'D:\proc\sales_result_sliced.csv'
ofname = r'D:\proc\sales_result_sliced_out.csv'
 
with open(ifname, 'r', newline='') as csvfile, \
     open(ofname, "w", newline='') as out_file:
    ...

И имена поменяй у переменных
  
ifname = r'D:\proc\sales_result_sliced.csv'
ofname = r'D:\proc\sales_result_sliced_out.csv'
 
with open(ifname, 'r', newline='') as csvifile, \
     open(ofname, "w", newline='') as csvofile:
    ...
Antonpython
Не могу догнать

Падает


 def take_head_of_file_four():
    
    ifname = r'D:\proc\sales_result_sliced.csv'
    ofname = r'D:\proc'
    
    with open(ifname, 'r', newline='') as csvifile, open(ofname, "w", newline='') as csvofile:
         reader = csv.DictReader(csvifile)
                 
         headers = reader.fieldnames
         
         for h in headers:             
             fieldnames = ['', str(h)]         
             writer = csv.DictWriter(os.path.join(csvofile,str(h),".csv"), fieldnames=fieldnames)
             counter = 1
             writer.writeheader()
             for row in reader:
                 writer.writerow({'': counter, str(h): row[str(h)]})
                 counter +=1
    #close the files
    csvifile.close()
    csvofile.close()

Ошибка

 Traceback (most recent call last):
  File "<ipython-input-2-91a8e40fd006>", line 1, in <module>
    take_head_of_file_four()
  File "D:\scripts\Cleancsv.py", line 115, in take_head_of_file_four
    with open(ifname, 'r', newline='') as csvifile, open(ofname, "w", newline='') as csvofile:
PermissionError: [Errno 13] Permission denied: 'D:\\proc'
py.user.next
Antonpython
Не могу догнать
Выше написано, как имена файлов записать.
Antonpython
Я сначала так и сделал, но что это поменяло? Точно такие же захардкоженые пути на выходной файл.
Зачем мне файл по одному и тому же пути?

Вы же видите, что мне на каждую новую колонку нужно создавать\менять название сохраняемого файла динамически.

И ошибка касается именно этой части кода.

Я здесь понять не могу, почему оно это сделать не может.

Хорошо. Буду пробовать.
py.user.next
Вот тут посмотри внимательно, как имена файлов указаны. Вот так и пиши.

Antonpython
Я здесь понять не могу, почему оно это сделать не может.
Потому что ты не понимаешь, как работает функция open() в питоне. proc - это директория. С чего ты взял, что open() может директории открывать? А с того, что ты вообще не знаешь, как функция open() работает, потому что ты не читал ничего. Читай к ней документацию, чтобы знать, что она открывает и как.

Antonpython
Зачем мне файл по одному и тому же пути?
Нельзя писать в тот же файл, из которого ведётся чтение. Если посреди файла случится ошибка, то исходный файл останется испорчен. Поэтому из входного файла ты перегоняешь данные в отдельный выходной файл. А потом, если тебе надо все эти изменения в одном файле произвести, ты просто старый файл удаляешь, а новый переименовываешь в него через пару os.remove() + os.rename().
Antonpython
Потому что изначально я правильно написал. Смотри первый экземпляр. Потом попробовал, как ты посоветовал - ну, у меня не получилось. Я начал экспериментировать от исходного понимания того, что я изначально понял.

Кто тебе сказал, что я собираюсь писать в тот же файл, из которого будет вестись чтение?
Мне нужно исходный файл распарсить на колонки. И из каждой колонки сделать новый файл с колонкой id.
А ты мне предлагаешь сделать одни выходной файл. И в него перегонять их исходного.
Это неправильное понимание.

Пока ничего не пробовал. Попробую - подумаю.
Antonpython
Снова уперся.

Короче
Этот работает
 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open('D:\\proc\\result.csv', 'w', newline='') as outfile:
         reader = csv.DictReader(csvfile)
         counter = 1
         fieldnames = ['Id', 'Total']
         writer = csv.DictWriter(outfile, fieldnames=fieldnames)
         writer.writeheader()
         for row in reader:
                  writer.writerow({'Id': counter, 'Total': row['Total']})
                  counter +=1
    csvfile.close()

Этот подобный - нет, зато я добился того, что названия файлов формируются динамически. Говнокод, конечно, колхоз. Но, блин. Я не знаю библиотек.
Пока не знаю.

Этот второй создает файлы, пишет заголовки, которые мне нужно, но не хочет, в отличие от первого туда парсить данные.
Я не понимаю, почему.
Подскажите, пожалуйста.
Я уже все.
 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile:
         reader = csv.DictReader(csvfile)
         headers = reader.fieldnames
         prepath = "D:\\proc\\"
         counter = 1  
         for h in headers:
             spath = os.path.join(prepath, str(h) + ".csv")
             with open(spath, 'w', newline='') as out_file:
				 fieldnames = ['Id', str(h)]
                 writer = csv.DictWriter(out_file, fieldnames=fieldnames)
                 writer.writeheader()
                 for row in reader:
                      writer.writerow({'Id': counter, str(h): row[str(h)]})
                      counter +=1
    csvfile.close()




py.user.next
Antonpython
Потому что изначально я правильно написал. Смотри первый экземпляр.
В первом сообщении ты написал
Antonpython
  
open("D:\\proc\\", "w", newline='') as out_file
Путь указывает на директорию.

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

Я вот смотрю, в другом топике тебе сказали, что csvfile.close() не надо вызывать, ты это мимо ушей пропустил. То есть у тебя явно что-то не то с головой. Либо ты просто бухой задишься за комп, либо ты просто дебил, либо и то и другое вместе. Если у человека родители алкаши, оно так часто и бывает - у них рождаются дети с недоразвитыми мозгами, которым образование давать не на что, потому что всё пропито, а учёба стоит денег, да и олигофрену с умственной отсталостью не очень-то образование даётся, сколько туда не вливай.

Но я на это делаю скидку. Если ты дебил, то ты изменить этого не можешь, даже если очень постараешься.

Antonpython
Кто тебе сказал, что я собираюсь писать в тот же файл, из которого будет вестись чтение?
Мне нужно исходный файл распарсить на колонки. И из каждой колонки сделать новый файл с колонкой id.
А ты мне предлагаешь сделать одни выходной файл. И в него перегонять их исходного.
Это неправильное понимание.
Если ты директорию как место для вывода указываешь, значит, вероятнее всего, ты собрался в тот же файл писать. А иначе зачем указывать директорию без имени файла?

Вот я тебе указал правильный код, как записать пути. Ты говоришь “это не работает”. Серьёзно? Может, это у тебя в голове что-то не работает?

Antonpython
Говнокод, конечно, колхоз. Но, блин. Я не знаю библиотек.
Ты вообще ничего не знаешь. Если ты думаешь, что ты что-то знаешь, то ты глубоко заблуждаешься. Завышенная самооценка свойственна алкашам. Им кажется, что они очень красивые, очень умные, очень успешные. Только по факту потом заканчивается у них всё совсем не так и они даже иногда это замечают. А то, что ты программируешь, ты будешь бабушкам на подъезде рассказывать.

Библиотек ты не знаешь?
Antonpython
  
         for h in headers:
             spath = os.path.join(prepath, str(h) + ".csv")
А вот в h уже строка находится, поэтому str(h) делать не надо. Это не незнание библиотек.

И всё это можно узнать и проверить
  
>>> import csv
>>> 
>>> lst = ['1,2,3', 'a,b,c', 'aa,bb,cc']
>>> 
>>> reader = csv.DictReader(lst)
>>> reader.fieldnames
['1', '2', '3']
>>> 
>>> list(reader)
[OrderedDict([('1', 'a'), ('2', 'b'), ('3', 'c')]), OrderedDict([('1', 'aa'), ('2', 'bb'), ('3', 'cc')])]
>>>

Но чтобы это знать и проверять и всё видеть прекрасно, нужно изучать питон. А можешь ли ты изучить питон - вот это уже вопрос.
Antonpython
Спасибо за интерпретацию, конечно)

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

Я вот смотрю, в другом топике тебе сказали, что csvfile.close() не надо вызывать
- значит все таки следишь…
- я все прекрасно читаю, не волнуйся, я просто все воедино свести еще не успел: сяду снова писать - все эти рекомендации я использую, пока просто идет копипаст своих прежних функций

Но чтобы это знать и проверять и всё видеть прекрасно, нужно изучать питон. А можешь ли ты изучить питон - вот это уже вопрос.
- я то смогу…

Сможешь ли ты нормальным более-менее стать… Вот это уже вопрос…
Здесь все такие бешенные анальники(как говорит небезызвестный психотерапевт Вероника) сидят или только выборочно…

Трудовые будни программиста) Вокруг одни алкаши и анальники… и так каждый день…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB