Написать в CSV с каждым элементом в отдельном столбце

1

В настоящее время у меня есть код, который записывает кучу пар значений ключей в csv. Однако он помещает все в одну колонку. Я хочу отделить значения от ключей, чтобы сделать их более читаемыми. Это будет большая информация, поэтому я хочу сделать ее максимально читаемой. Вот мой код:

import glob
from pathlib import Path
import datetime
import re
import csv




#Gets the current time and returns it in ddmmyyyy format to match Transaction log file names

def timeteller():
    now = datetime.datetime.now()
    month = str('{:02d}'.format(now.month))
    day1 = now.day 
    day =  str('{:02d}'.format(day1))
    year =str(now.year)
    time =year+month+day
    return time

#Folder location for G4S unit transaction reports

def these_files(x, y):
    thislist = []
    configfiles = Path('O:/Unit Management/Reports/G4S/').glob('{}*/{}*Transaction.txt'.format(x, y))

    for files in configfiles:
        thislist.append(files)

    return thislist

#Checks to make sure the date and ba numbers are numbers only

def hasNumbers(inputString):
    numberfinal = []
    numberfinal = re.findall("[.0-9]", inputString)
    if numberfinal == []:
        numberfinal = '1'
    return numberfinal

#Selects which transaction reports to get the data from.  
#Transaction logs that have no date return nothing

def get_odometers(thesepath):
    get_this = []

    for thispath in thesepath:

        with open(thispath,"r") as f:
            searchlines = f.readlines()
        for i, line in enumerate(searchlines):
            if "StartDay" in line:
                get_this.append(line)



    return get_this

##Gets odometer numbers based on string match.  Puts each number in key value pair
#Serial Number added to key value pair

def make_pretty(checkthis):
    the_numbers = {}
    #the_numbers[''] = banumber
    for i, line in enumerate(checkthis):
        #the_numbers['Serial'] = banumber
        if 'StartDay' in line:
            for l in checkthis[i:i+1]: 
                numbers = l[59:67]
                #numberschecked = hasNumbers(numbers)
                the_numbers[banumber] = numbers



    return the_numbers

#Gets the time in integer format
intnow = int(timeteller())
#Goes back as many days as you would like, comment out to get yesterday
#intnow -= 1
#turns back to string
now = str(intnow)
thelist = []
#opens the banumbers list
thispath = open('banumberlist4.txt')
finallist = []
#counter to see what number it on
counter = 0
#loop to iterate through each ba number
for files in thispath:
    getem = files
    banumber = getem[0:8]
    print(banumber)
    #combines each ba number with the date and time to match transaction report format
    combined = '{}_{}'.format(banumber,now)
    thepaths = these_files(banumber, combined)
    needtomakepretty = get_odometers(thepaths)
    goeslast = make_pretty(needtomakepretty)
    finallist.append(goeslast)
    counter+=1
    print(counter)

#writes to txt file in dictionary(key value pair (json)) format
f = open ('c:\\users\\me\\desktop\\versionstest.csv', 'w')
for ba in finallist:
    sba = str(ba)
    f.write('{}\n'.format(ba))
    #f.write(',')   

В конце он звучит так:

{'02105': '  (5.10)'}

В принципе, я хочу отделить номер 02105 от 5.10 и иметь их в отдельной колонке. Любой совет?

  • 1
    Вы создаете файл с разделителями-запятыми. Вы должны разделить значения запятыми.
  • 0
    Почему вы пишете вручную строку json вместо использования модуля json или csv ? И почему вы пишете в формате json, когда расширение файла .csv ? Что вы хотите получить в итоге?
Показать ещё 1 комментарий
Теги:
csv
python-3.x

1 ответ

1
Лучший ответ

csv обычно используют некоторые разделители: ',' (запятая), '' (пробел), '\ t' (вкладка) и т.д.

Таким образом, вы должны использовать "," как делиметр, а не "_" на

combined = '{}_{}'.format(banumber,now)
  • 0
    Вполне имеет смысл, спасибо, сэр.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню