Изменить файл CSV [Невозможно использовать pandas или numpys]

Мне нужно добавить столбец в файл CSV, созданный с помощью данных, импортированных из Интернета. Новый столбец должен представлять собой объединение двух строк, например 06_2018.

New_Format_Data = ''

Output_File = open('Desktop/HW3/' + state_names[counter] +  '.txt','w')

for counter in range(0 , len(urls)):#Will go tru all the states.
    print (urls[counter])
    
    html = urllib.request.urlopen(urls[counter]).read().decode('utf-8')#opening url
    
    rows = html.splitlines(1)#Split the data in rows. The number 1 is very important
    
    if counter ==0:
        New_Format_Data = "Test" + rows[0] #Header
        
    for row in range(1, len(rows)): #First row...
            
        New_Format_Data += 'Test' + '\t' + rows[row]#Adding that state column.
    
Output_File.write(New_Format_Data)#Once finished with the for loops then the it will download and close.
Output_File.close()

можно ли использовать стандартный модуль csv?

furas 19.03.2022 01:45

в чем проблема? Вы получаете сообщение об ошибке? всегда размещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопросе (не в комментариях) в виде текста (не скриншота, а не ссылки на внешний портал). Есть и другая полезная информация.

furas 19.03.2022 01:46

было бы более читаемо, если бы вы использовали True вместо 1 в splitlines(True)

furas 19.03.2022 01:48

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

furas 19.03.2022 01:51

вы могли бы показать примеры строк - до и после модификации.

furas 19.03.2022 01:53

что такое "Test"? Это имя новых столбцов? он должен иметь , перед следующими столбцами. Почему вы используете \t? У вас есть столбцы, разделенные , или \t?

furas 19.03.2022 02:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я понятия не имею, что у вас есть в строках, и какие столбцы вы хотите объединить, поэтому я использую столбцы 1 и 2 в качестве примера.

Вам нужно будет разделить строку (строку) на список значений, затем заменить/добавить значение в этот список, затем объединить все значения обратно в одну строку, а затем вы можете записать в новый файл.

Нужно будет удалить \n из конца строки, потому что нужно добавить новое значение в ту же строку, поэтому 1 в splitlines() будет бесполезно.


Что-то вроде этого.

Я получаю строку напрямую из списка вместо использования индекса и range(len(..))

for row in rows[1:]:  # get directly string instead of index
    
    # convert to list
    row = row.split(',')
    
    # create new value using column 1 and 2
    new_value = row[1] + '_' + row[2]
    
    # append to list
    row.append(new_value)
    
    # convert back to string
    row = ','.join(row)
    
    # add new row and `\n` at the end
    New_Format_Data += 'Test' + '\t' + row + '\n'

Полный код может выглядеть так

# PEP8: at least two spaces before `#` and one space after `#

new_format_data = ''  # PEP8: `lower_case_names` for variables

output_file = open('Desktop/HW3/' + state_names[counter] +  '.txt','w')

for counter, url in enumerate(urls):
    print('url:', url)
    
    html = urllib.request.urlopen(url).read().decode('utf-8')  # opening url
    
    rows = html.splitlines()  # split the data in rows. DON'T NEED `1` because I don't need `\n'
    
    if counter == 0:
        new_format_data = "Test" + rows[0] + ',new_columns' + '\n'  # header with new column
        
    for row in rows[1:]:  # get directly string instead of index
        
        # convert to list
        row = row.split(',')
        
        # create new value using column 1 and 2
        new_value = row[1] + '_' + row[2]
        
        # append to list
        row.append(new_value)
        
        # convert back to string
        row = ','.join(row)
                    
        new_format_data += 'Test' + '\t' + row + '\n'  # adding that state column.
    
# --- after loop ---

output_file.write(new_format_data)  # once finished with the for loops then the it will download and close.
output_file.close()

Но это может иметь проблемы, если какой-то столбец будет иметь значение ,, потому что split будет рассматривать его как разделитель. Так что лучше использовать стандартный модуль csv, который решит все проблемы.

Что-то вроде

import csv

output_file = open('Desktop/HW3/' + state_names[counter] +  '.txt','w')

# create csv writer 
output_csv = csv.writer(output_file)

for counter, url in enumerate(urls):
    print('url:', url)
    
    html = urllib.request.urlopen(url).read().decode('utf-8')  # opening url
    
    # read all rows from csv 
    rows = list(csv.reader(html.splitlines()))
                
    if counter == 0:
        
        headers = rows[0]
        
        headers[0] = "Test" + headers[0]
        headers.append('new_colum')
        
        # write headers
        output_csv.writerow(headers)
        
    for row in rows[1:]:  # get directly string instead of index
        # create new value using column 1 and 2
        new_value = row[1] + '_' + row[2]
        
        # append to row
        row.append(new_value)
        
        # write row
        output_csv.writerow(row)
    
# --- after loop ---

output_file.close()

PEP 8 -- Руководство по стилю для кода Python

Отлично, это сработало!

yuripao71 20.03.2022 15:28

В итоге получилось так:

new_format_data = ''  # PEP8: `lower_case_names` for variables

output_file = open('Desktop/HW3_2/' + state_names[counter] +  '.txt','w')

for counter, url in enumerate(urls):
    print('url:', url)
    
    html = urllib.request.urlopen(url).read().decode('utf-8')  # opening url
    
    rows = html.splitlines()  # split the data in rows. DON'T NEED `1` because I don't need `\n'
    
    if counter == 0:
       # new_format_data = "Month_Year" + '\t' + rows[0] + '\n'  # header with new column
        
        new_format_data = rows[0] + "Month_Year"+'\n'  # header with new column
    for row in rows[1:]:  # get directly string instead of index
        
        # convert to list
        row = row.split('\t')
        
        # create new value using column 1 and 2
        new_value = row[2] + '_' + row[1]
        
        # append to list
        row.append(new_value)
        
        # convert back to string
        row = '\t'.join(row)
                    
        new_format_data += row + '\n'  # adding that state column.
   
output_file.write(new_format_data)  # once finished with the for loops then the it will download and close.
output_file.close()

Хочу пересмотреть, на самом деле это был txt формат, а не CSV. Теперь я пытаюсь удалить столбец и отфильтровать информацию. Итак, один из столбцов — «год». Исходные данные начинаются с 1976 по 2022. Мне нужна информация только с 2015 по 2020. Пробовал несколько вещей, но я сломал остальную часть кода :(

если у вас есть новая проблема, вы должны создать новый вопрос на новой странице. Но, похоже, вам нужно только if пропустить (как минимум) код new_format_data += row + '\n', когда в какой-то строке указан неправильный год (но вы не сказали, в каком столбце указан год)

furas 20.03.2022 16:17

Другие вопросы по теме