Удалить начальный 0 в конкретном CSV-файле - PullRequest
1 голос
/ 25 апреля 2019

У меня есть CSV-файл с именем new.csv. Я пытаюсь удалить все первые 0 в определенном столбце с именем code.

id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030

Это всего лишь пример того, как выглядит CSV-файл, за исключением того, что в нем почти 1000 строк.Я просто хочу удалить первые 0 из столбца кода.

Я пытаюсь найти решение, которое я могу отредактировать целый столбец для дальнейшего использования.Например, предположим, что есть ведущий символ 'k', который я хочу удалить из столбца.

Я видел несколько примеров в Интернете, но он не работал.

Это то, что показано ниже

import pandas as pd
import sys

with open('new.csv') as infile:
    title = next(infile)
    infile.seek(0)
    table = pd.read_csv(infile)

table.rename(columns={'Unnamed: 2':''}, inplace=True)

table['code'] = table['code'].str.replace("0", "")
sys.stdout.write(title)
table.to_csv(sys.stdout, ',', index=False)

Ответы [ 5 ]

2 голосов
/ 25 апреля 2019

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

0+([1-9][0-9]*)

И замените его \1 в основном содержимым group1

Демо

Попробуйте эти Pythonкоды,

import re

s = '''id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030'''

print(re.sub(r'0+([1-9][0-9]*)', r'\1', s))

Печать чисел без начальных нулей,

id,name,code <br>
0,kevin,10 <br>
1,john,11 <br>
2,casey,20 <br>
3,micheal,30

Редактировать:

Вы можете создать такую ​​функцию, котораяпринимает имя файла в качестве аргумента и генерирует новый файл с именем inputfilename.out

import re
from shutil import move
from os import remove


def remove_leading_chars(inputfile):
    with open(inputfile, 'r', encoding="utf-8") as infile, open(inputfile+'.out', 'w', encoding="utf-8") as outfile:
        for s in infile.readlines():
            s = re.sub(r',m+', r',', s)
            outfile.write(s)


remove_leading_chars('data.txt')
remove('data.txt')
move('data.txt.out', 'data.txt')
print('writing done')

Содержимое входного файла data.txt

id,name,code <br>
0,mmmkevin,010 <br>
1,mmmjohn,011 <br>
2,mmmcasey,020 <br>
3,mmmicheal,030

Содержимое перезаписанного data.txt файл

id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,icheal,030
1 голос
/ 25 апреля 2019

Вы должны попробовать удалить 0, используя фрагмент строки, например:

table['code'] = table['code'].str[1:]

Кроме того, если после 0 есть запятая, например: 0,, попробуйте использовать это вместо:

table['code'] = table['code'].str[2:]
0 голосов
/ 25 апреля 2019

Попробуйте заменить вашу строку table['code'].str.replace("0", "") на следующую:

1.Это удалит любую начальную цифру

table['code'].replace('^\d', '', regex=True)

2.Это приведет к удалению начального 0, а именно

table['code'].replace('^0', '', regex=True)

Обратите внимание: чтобы навсегда заменить его, используйте inplace=True

table['code'].replace('^0', '', regex=True, inplace=True)
0 голосов
/ 25 апреля 2019

Рассмотрим мой пример:

txt = '''id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030'''
txt = txt.split('\n')
txt = [i.rpartition(',') for i in txt]
txt = [''.join([i[0],i[1],i[2].lstrip('0')]) for i in txt]
txt = '\n'.join(txt)
print(txt)

Выход:

id,name,code <br>
0,kevin,10 <br>
1,john,11 <br>
2,casey,20 <br>
3,michaeal,30

Обратите внимание, что для простоты я жестко закодировал текстовый контент. Я использовал методы str: rpartition чтобы наконец разделить , и lstrip чтобы избавиться от 0.

РЕДАКТИРОВАТЬ: Вы можете трактовать .csv как простой текстовый файл и использовать read для получения контента, т.е. вместо жесткого кодирования txt просто выполните:

with open('yourfile.csv','r') as f:
    txt = f.read()

В конце вместо печати txt do:

with open('yournewfile.csv','w') as f:
    f.write(txt)
0 голосов
/ 25 апреля 2019

Я могу предложить привести к номеру, пока вы читаете из файла. Например, int(0001010) приведет к 1010.

по умолчанию DataFrame угадывает этот столбец как число, поэтому при чтении он преобразуется в int.

data = pd.read_csv('C:/random/d2',header=None,names=['W1','W2'])
df=pd.DataFrame(data)
print(df)

результат

        W1  W2
0    kevin  10
1     john  11
2    casey  20
3  micheal  30

Обновление для более подробной версии, обеспечивающей исполнение панд / кастинг

data = pd.read_csv('C:/random/d2',header=None,names=['W1','W2'])
df=pd.DataFrame(data)
print(df)

dfNew=pd.DataFrame(columns=['W1','W2'])
rows,clumns=df.shape
for index in range(rows):
    tempRow=[df.iat[index,0], int(df.iat[index,1])]
    dfNew.loc[len(dfNew)]=tempRow
print(dfNew)

Результат

        W1  W2
0    kevin  10
1     john  11
2    casey  20
3  micheal  30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...