Мне нужно добавить столбец в файл 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()
в чем проблема? Вы получаете сообщение об ошибке? всегда размещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопросе (не в комментариях) в виде текста (не скриншота, а не ссылки на внешний портал). Есть и другая полезная информация.
было бы более читаемо, если бы вы использовали True
вместо 1
в splitlines(True)
вам нужно будет разделить строку (строку) на список значений, затем заменить значения в этом списке, затем объединить все значения обратно в одну строку, а затем вы можете записать в новый файл.
вы могли бы показать примеры строк - до и после модификации.
что такое "Test"
? Это имя новых столбцов? он должен иметь ,
перед следующими столбцами. Почему вы используете \t
? У вас есть столбцы, разделенные ,
или \t
?
Я понятия не имею, что у вас есть в строках, и какие столбцы вы хотите объединить, поэтому я использую столбцы 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
Отлично, это сработало!
В итоге получилось так:
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'
, когда в какой-то строке указан неправильный год (но вы не сказали, в каком столбце указан год)
можно ли использовать стандартный модуль
csv
?