I'm trying to print certain values into a CSV from a list I'm passing through. Here is my function:
current = datetime.datetime.now() #defining datetime for use in function
def write_csv(custody_parts):
with open((current.strftime("%m_%d_%y_%H_%M_%S")) + '.csv', 'w', newline='') as csvfile:
csvfile = io.StringIO()
fieldnames = ['serial', 'user', 'time']
writer = csv.DictWriter(csvfile, extrasaction='ignore', fieldnames=fieldnames)
writer.writeheader()
writer.writerows(custody_parts)
csvfile.getvalue()
print(csvfile.getvalue())
return(csvfile.getvalue())```
Then I call it with the list I'm trying to pass through:
write_csv(parts)
and it creates the file: 06_06_18_12_13_53.csv
and prints to the screen:
serial,user,time
serial1,user1,date1
serial2,user2,date2
serial3,user3,date3
but the file it creates is empty, so it isn't writing to the file it is creating.
Can someone point me in the right direction?
Thanks ~
EDIT:
I ended up going with this instead:
def write_csv(custody_parts):
current = datetime.datetime.now()
with open((current.strftime("%m_%d_%y_%H_%M_%S")) + '.csv', 'w', newline='') as csvfile:
custodywriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
custodywriter.writerow(['serial', 'user', 'time'])
for i in custody_parts:
x = [i["serial"],i["user"],i["time"]]
custodywriter.writerow(x)
custodywriter.writerow(["End of Report"])
Related
So I have these two functions in python:
import csv
#========== reader ==========#
def Test_reader(target_file):
with open(target_file, newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter='\t')
for row in spamreader:
print(', '.join(row))
#========== DictReader ==========#
def Test_DictReader(target_file, dict_id):
# 'first_name' will be the dictionary's first row ID
fieldnames = ['first_name', 'last_name', 'email']
with open(target_file, "r", newline='') as csvfile:
spamreader = csv.DictReader(csvfile,fieldnames=fieldnames)
for row in spamreader:
print(row[dict_id])
print(Test_reader("names.csv"))
# Or
print(Test_DictReader("names.csv","first_name"))
There are no errors but it also prints "None"
Test_reader prints:
.....................................
.....................................
Corey,Smith,coreysmith#bogusemail.com
Mary,Patterson,marypatterson#bogusemail.com
Jane,Stuart,janestuart#bogusemail.com
Travis,Arnold,travisarnold#bogusemail.com
John,Robinson,johnrobinson#bogusemail.com
Travis,Arnold,travisarnold#bogusemail.com
None
Test_DictReader prints:
.....................................
.....................................
coreysmith#bogusemail.com
marypatterson#bogusemail.com
janestuart#bogusemail.com
travisarnold#bogusemail.com
johnrobinson#bogusemail.com
travisarnold#bogusemail.com
None
the csv file "names.csv" goes like this.
first_name,last_name,email
John,Doe,john-doe#bogusemail.com
Mary,Smith-Robinson,maryjacobs#bogusemail.com
Dave,Smith,davesmith#bogusemail.com
Jane,Stuart,janestuart#bogusemail.com
. . .
There are no spare spaces/lines.
I have been using this code to extract data from website and store it into a csv file. However, I would like to know how can I add an empty row between the data without using hardcode, for instance a empty row that seperate the title 'Total' and the data extracted from Total.text. (Like this picture.) This is the link I extra data "https://finance.yahoo.com/quote/0700.HK/sustainability?p=0700.HK"
with open(f'{stockname}_sustainability.csv', 'w', newline='') as csvfile:
fieldnames = ['Total','Type','Percentile','ERS','SRS','GRS','mclevel']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Total':int(Total.text),'Type' : Type.text,'Percentile':int(Percentile[0:2]), 'ERS' : float(ERS.text),'SRS':float(SRS.text),'GRS':float(GRS.text),'mclevel':int(mclevel.text)})
import csv
with open('Book1.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
fieldnames = ['Total', 'Type', 'Percentile', 'ERS', 'SRS', 'GRS', 'mclevel']
writer.writerow("".join(fieldnames))
writer.writerow("\n")
writer.writerow({'Total':int(Total.text),'Type' : Type.text,'Percentile':int(Percentile[0:2]), 'ERS' : float(ERS.text),'SRS':float(SRS.text),'GRS':float(GRS.text),'mclevel':int(mclevel.text)})
By using write.writerow("\n") you will create one empty row.
I need to write the following values from a list to a CSV.
my_list[0]
March,'1.800931853','1.843227636','1.861992226','1.880196477','1.907555762','1.853076585','1.770560438','1.837108443','1.867213313','1.849542335','1.913505573','2.023772836','1.899717681'
my_list[1]
July,'10.809832','10.57868801','9.571741038','8.850265221','9.154250034','9.172628705','10.35004201','9.36852657','8.689944331','10.1053826','9.18756731','8.541507801','8.054240996'
I have tried the following:
def saveData(my_list):
file_name = 'months.csv'
with open(file_name, 'w') as f:
writer = csv.writer(f)
for row in zip(my_list):
writer.writerows([row])
f.close()
The CSV should look like this with each value in a separate cell
March 1.800931853 1.843227636 1.861992226 1.880196477 1.907555762 1.853076585 1.770560438 1.837108443 1.867213313 1.849542335 1.913505573 2.023772836 1.899717681 2.152980753
This works with Python 3:
import csv
def save_data(my_list):
file_name = 'months.csv'
with open(file_name, 'w') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_NONE, delimiter=' ')
for row in my_list:
wr.writerow(map(str, row))
#example:
save_data([["March", 1.2, 1.5], ["July", 2.3, 4.5678, 9.101]])
Been having trouble with using variables in a new dirpath when using with open to create a csv file.
I can create the dirpath fine along with the .csv filename and add them with os.path.join .
But when i try to use the entire correctly formatted path in the open statement it is adding an extra backslash next to the current backslashes in the string?? could not find any documentation on why this may be happening.
This is the error
FileNotFoundError: [Errno 2] No such file or directory: 'Logs\\14-05-2018\\dfg.csv'
If i simply write the following i can create the subfolders and csvs no problemo.
with open(Logs\1234\asd.csv) 'w') as csvfile:
So this is what i am getting an error in on line 43 which is the with open(csvlogPath, 'w') as csvfile: I have tried with r instead of 'w' and same problem. At a loss after two days time to ask you guys. :)
import csv, os.path
#Get and create csv filename string
logFN = input("Please name your trade.\n#")
suffix = '.csv'
csvname = logFN + suffix
#Create dir name string
t = time.strftime("%d-%m-%Y-%H%M")
dirsname = os.path.join('Logs', t)
csvlogPath = os.path.join(dirsname,csvname)
with open(csvlogPath, 'w') as csvfile:
filewriter = csv.writer(csvfile, delimiter=',', lineterminator='\n', quotechar='|', quoting=csv.QUOTE_MINIMAL)
filewriter.writerow(['get', 'new', 'values', 'later'])
with open(csvlogPath, 'w') as f:
reader = csv.reader(f)
# read file row by row
rwsCount = 0
for row in reader:
print (row, rwsCount)
rwsCount += 1
line_number = rwsCount-1
print (line_number)
with open(csvlogPath, 'w') as f:
mycsv = csv.reader(f)
mycsv = list(mycsv)
text = mycsv[line_number][0]
print (text)
you need to make the dirs in python you can use os.makedirs(path) like so:
csvlogPath = os.path.join(dirsname,csvname)
os.makedirs(os.path.dirname(csvlogPath), exist_ok=True)
with open(csvlogPath, 'w') as csvfile:
filewriter = csv.writer(csvfile, delimiter=',', lineterminator='\n', quotechar='|', quoting=csv.QUOTE_MINIMAL)
filewriter.writerow(['get', 'new', 'values', 'later'])
With open, use 'r' to read and 'w' to write so you need to change the next to opens to:
with open(csvlogPath, 'r') as f:
reader = csv.reader(f)
# read file row by row
rwsCount = 0
for row in reader:
print (row, rwsCount)
rwsCount += 1
line_number = rwsCount-1
print (line_number)
with open(csvlogPath, 'r') as f:
mycsv = csv.reader(f)
mycsv = list(mycsv)
text = mycsv[line_number][0]
test this code :
import csv, os.path
#Get and create csv filename string
import time
logFN = input("Please name your trade.\n#")
suffix = '.csv'
csvname = logFN + suffix
#Create dir name string
t = time.strftime("%d-%m-%Y-%H%M")
dirsname = os.path.join('Logs', t)
###########################
if not os.path.exists(dirsname):
os.makedirs(dirsname)
###########################
csvlogPath = os.path.join(dirsname,csvname)
with open(csvlogPath, 'w') as csvfile:
filewriter = csv.writer(csvfile, delimiter=',', lineterminator='\n', quotechar='|', quoting=csv.QUOTE_MINIMAL)
filewriter.writerow(['get', 'new', 'values', 'later'])
with open(csvlogPath, 'r') as f:
reader = csv.reader(f)
# read file row by row
rwsCount = 0
for row in reader:
print (row, rwsCount)
rwsCount += 1
line_number = rwsCount-1
print (line_number)
with open(csvlogPath, 'r') as f:
mycsv = csv.reader(f)
mycsv = list(mycsv)
text = mycsv[line_number][0]
print (text)
I have a small script that reads a pipe '|' delimited csv file and then writes it to another file as comma delimited. It works fine. Code, input file and output file below:
import csv
ifile = "d:\\python\\project\\cars-original.csv"
ofile = "d:\\python\\project\\cars.csv"
with open(ifile, 'r') as f:
reader = csv.reader(f, delimiter='|')
with open(ofile, 'w', newline='') as of:
writer = csv.writer(of, delimiter=',')
for row in reader:
writer.writerow(row)
Reading|Make|Model|Type|Value
Reading 0|Toyota|Previa|distance|19.83942
Reading 1|Dodge|Intrepid|distance|31.28257
Reading,Make,Model,Type,Value
Reading 0,Toyota,Previa,distance,19.83942
Reading 1,Dodge,Intrepid,distance,31.28257
I now want to modify the script so that it can auto-read the delimiter type.
I have found several examples online, but when I run mine I get a blank file for output. No errors, just blank. Not sure what I am doing wrong.
My modified (broken) script:
import csv
ifile = "d:\\python\\projects\\cars-original.csv"
ofile = "d:\\python\\projects\\cars.csv"
with open(ifile, 'r') as f:
reader = csv.reader(f)
dialect = csv.Sniffer().sniff(f.read(1024), delimiters=',|')
with open(ofile, 'w', newline='') as of:
writer = csv.writer(of, dialect)
for row in reader:
writer.writerow(row)
In the example in Python documentation (https://docs.python.org/3.6/library/csv.html) file pointer is moved to the beginning of the file, right after the dialect detection.
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
This works:
import csv
ifile = "d:\\python\\project\\cars-original.csv"
ofile = "d:\\python\\project\\cars.csv"
with open(ifile, 'r') as f:
dialect = csv.Sniffer().sniff(f.readline(), [',', '|'])
f.seek(0)
reader = csv.reader(f, dialect)
with open(ofile, 'w', newline='') as of:
writer = csv.writer(of, delimiter=',')
for row in reader:
writer.writerow(row)