Selamlar, tez projemde web sitesinden veri çekiyorum ve çekeceğim dosyaların boş olup olmadığını kontrol eden bir kod yazmam lazım ve bu kod, eğer dosya boş ise dosyayı kaydetmemeli. bu problemi nasıl çözebilirim?
Merhaba, dosyanın içeriğini görebildiğini varsayıyorum. Şu tarz bir şey işine yarayabilir.
dosya = open("dosyaadi.dosyauzantisi", "r")
if dosya.read() == "":
# dosyayı yükleme
else:
# dosyayı yükle
Ellerine sağlık, teşekkür ederim. Peki böyle bir hatayı neden alırım?
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
Dosyayı yükleyeceğim yerin, mesela C\Users\X\ arasındaki slashleri iki tane yapınca yani C\Users\X\ şekline getirince bu hata kayboldu fakat şimdi de şu hatayı alıyorum. Kodu da buraya bırakıyorum sorunu çözebilecek olan biri mantığı anlatıp düzeltmeme yardımcı olursa çok minnettar olurum.
HATA: TypeError: vericek() missing 2 required positional arguments: ‘mounth’ and ‘day’
KOD : import urllib.request
import datetime
import shutil, os
import os.path
from os import path
def vericek(year, mounth, day):
date = datetime.datetime(year, mounth, day)
if date.weekday()>4:
return
data = open(“data.csv”, “r”)
if data.read() == “”:
os.remove(“data.txt”)
else:
urllib.request.urlretrieve(“https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2”, “C:\Users\kartalgözü\.spyder-py3\data”)
url='https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2'
request = urllib.request.Request(url.format(ddate))
response = urllib.request.urlopen(request)
orgsource=response.read().decode('utf-8')
source=orgsource.replace('<table border="1" cellpadding="1" class="tableClass"><tr><th>','')
source=source.replace('</th></tr><tr><td>','\n')
source=source.replace('</th><th>',';')
source=source.replace('</span></td></tr><tr><td>','\n')
source=source.replace('<span style="font-size:10px; color:#666"> TL',';')
source=source.replace('</span></td><td>',';')
source=source.replace('</td><td>',';')
source=source.replace(',','.')
source=source.replace('</span></td></tr></table>','')
with open('data/'+ddate+'.csv','w') as f:
f.write(source)
for y in range(2017, 2023):
for m in range(1,13):
for d in range(1,32):
ddate = str(y)+'.'+str(m)+'.'+str(d)
vericek(ddate)
dosya\konumu\ şeklinde değil de dosya\\konumu şeklinde yarsanız hata çıkmayacak. Tek slash kullanınca kaçış kodu kullanacağınızı zannediyor.
kodu ``` ``` işaretlerinin arasına alırsanız kod daha okunabilir olur ve yardım etmemiz kolaylaşır.
Hata, vericek fonksiyonuna sadece 1 argüman atamış olmanızdan kaynaklanıyor. Kodu incelediğinizde farkedeceksiniz ki vericek fonksiyonu 3 argüman istiyor. Bunlar: year, mounth ve day. Siz sadece 1 argüman vermişsiniz bu yüzden kalan 2 argümanı da bekliyor. Kodla biraz oynadım ve artık TypeError hatasını almıyorum. Ayrıca slashlarda da hata vardı onları da düzelttim ve kodun son hali şöyle oldu:
import urllib.request
import datetime
import shutil, os
import os.path
from os import path
def vericek(year, mounth, day):
date = datetime.datetime(year, mounth, day)
if date.weekday()>4:
return
data = open("data.csv", "r")
if data.read() == "":
os.remove("data.txt")
else:
urllib.request.urlretrieve("https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2", "C:\\Users\\kartalgözü\\.spyder-py3\\data")
url='https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2'
request = urllib.request.Request(url.format(ddate))
response = urllib.request.urlopen(request)
orgsource=response.read().decode('utf-8')
source=orgsource.replace('<table border="1" cellpadding="1" class="tableClass"><tr><th>','')
source=source.replace('</th></tr><tr><td>','\\n')
source=source.replace('</th><th>',';')
source=source.replace('</span></td></tr><tr><td>','\\n')
source=source.replace('<span style="font-size:10px; color:#666"> TL',';')
source=source.replace('</span></td><td>',';')
source=source.replace('</td><td>',';')
source=source.replace(',','.')
source=source.replace('</span></td></tr></table>','')
with open('data/'+ddate+'.csv','w') as f:
f.write(source)
for y in range(2017, 2023):
for m in range(1,13):
for d in range(1,32):
ddate = str(y)+'.'+str(m)+'.'+str(d)
vericek(y, m, d)
ancak bende data.csv dosyası olmadığı için bundan sonrası size kalmış çünkü data.csv dosyası olmadığı için hata alıyorum
emin olun bende data.csv dosyası var ben de hata alıyorum gece gece vakit ayırmanız gerçekten beni mutlu etti
emeğinize sağlık şimdi de nedense permission hatası alıyorum. Dosya adı ile dosya yolunu karıştırıyorum sandım bir iki düzeltme yaptım ama işe yaramadı. amacım gün-gün veri toplarken hafta sonlarını elemek ama hafta sonları haricinde diğer tatilleri de elemem gerek bunun için gelecek olan dosyayı kontrol edip boş ise silip dolu ise tutmam gerekiyor. Bir de fonksiyonumda benim sadece 1 argüman girdiğimi nasıl anladınız? Ben ne yaparak tek argüman girmiş oluyorum? Çok soru sordum biliyorum
İstediğiniz kadar soru sorabilirsiniz.
vericek(ddate) teki ddate argüman oluyor. Fonksiyonu tanımlarken 3 tane girileceğini belirtmişsiniz ama 1 tane girmişsiniz.
İşletim sistemi dosyanın olduğu konuma erişmenize (veya başka bir eyleme) izin vermiyor. Programı yönetici olarak çalıştırmayı veya erişmek istediğiniz dosyayı işletim sisteminin açmanıza izin verdiği bir konuma koymanız iyi olabilir. data.csv i açarken hata alıyorsanız data.csv i (eğer kodun olduğu dosya ile aynı klasörde değilse) kodun olduğu dosya ile aynı klasöre taşımayı deneyin (permission error ile bir alakası yok ama aklıma bir bu geldi). Eğer hata ‘data/’+ddate+‘.csv’ kısmında ise belki şu şekilde işe yarayabilir:
- data klasörünü kodunuzun olduğu klasörün içine koyun
with open('data/'+ddate+'.csv','w') as f:
iwith open('./data/'+ddate+'.csv','w') as f:
olarak değiştirin (o olmassa belkiwith open('/data/'+ddate+'.csv','w') as f:
de işe yarayabilir)
birde belki de os.remove(“data.txt”) den dolayı permission error veriyor olabilir sonuçta bir dosya silmeye çalışıyorsunuz. Ayrıca hatanın tamamını verirseniz hatanın hangi koddan dolayı çıktığını anlayabiliriz. Böylece bir sürü tahmin ile uğraşmak yerine direkt sorunun kaynağını bulmuş oluruz.
önemli değil
Çok çok teşekkür ederim:)
Acemilik işte mazur görün
Debug yaptığımda hatanın burada olduğunu gözlemledim. Kod kısmını, hatasıyla beraber aşağıya yazıyorum.
data = open(“data.csv”, “r”)
FileNotFoundError: [Errno 2] No such file or directory: ‘data.csv’
ama mesela hafta sonu veya herhangi bir veri denetimi yapmadığımda kodu çalıştırdığımda direkt boş veya dolu farketmeksizin 5 sene boyunca her günün verisini alıp saklıyor problemsiz bir şekilde. temp dosyam ile data dosyam da aynı yerde ama neden böyle bir hata veriyor anlamış değilim.
Rica ederim
Problem değil.
Dosya kod ile aynı yere kaydedilmiyor olabilir mi ? Birde temp dosyası demişsiniz temp dosyasının içinde mi bulunuyor data.csv ? Eğer öyleyse data = open(“./temp/data.csv”, “r”) deneyebilirsiniz.
Birde eğer dosya kesinlikle kaydediliyor diyorsanız dosyayı kaydedip kodunuz ile aynı yere atın sonra kodu çalıştırın belki de başka bir klasöre kaydediliyordur, eğer başka bir yere kaydediliyorsa o konumdan kodunuz ile aynı konuma atın sonra kodu çalıştırın.
Birde kodunuzu inceleyince şu kısmı gördüm:
with open('data/'+ddate+'.csv','w') as f:
f.write(source)
belki de data = open(“./data/data.csv”, “r”) işe yarayabilir ama ben data.csv diye bir dosyanın kaydedildiği hiç bir yer göremiyorum kodda ancak diğer mesajlarınıza baktığımda data.csv dosyasının olduğunu görebiliyorum. Ayrıca temp dosyasından kasıt nedir ? Windows kullandığınızı var sayıyorum, eğer %temp% den bahsediyorsanız program oraya bakmıyor olabilir (eğer programı exe ye çevirdiyseniz programı açtığınızda temp te bir klasör oluşturacaktır ama program orayı kontrol etmiyor olabilir).
temp dosyası dediğim not defteri ya. template diyeyim belki daha tanıdık gelir. data adında verileri topladığım bir klasör var bir de data.csv diye excel dosyam varmış. Excel dosyamı kodu yazdığım yere atınca hata kodum değişti şimdi de bu hatayı alıyorum.
PermissionError: [Errno 13] Permission denied: ‘C:\Users\kartalgözü\.spyder-py3\data’
bunu internette aratırken de şöyle bir çözüm buldum ama ben pek anlayamadım belki sizin aklınıza başka şeyler getirir diye paylaşayım dedim.
Siz data.csv e değil data ya ulaşmayı denemişsiniz. Anladığım kadarıyla data.csv dosyası data klasörünün içinde. Eğer şu kodu çalıştırmayı denerseniz:
open("C:\\Users\\kartalgözü\\.spyder-py3\\data", "r")
PermissionError
alacaksınız çünkü bir klasörü okumaya çalışıyorsunuz.
Büyük ihtimalle C:\Users\kartalgözü.spyder-py3\data yı C:\Users\kartalgözü.spyder-py3\data\data.csv olarak değiştirirseniz sorun çözülecek.
yok hocam data.csv spyder-py3 ün içinde klasör olan “data” da aynı şekilde spyder-py3 ün içinde.
bu kısmı da aradaki back slashleri çift hale getirip yaptım ama hala permission error alıyorum. Okuldaki hocam “Sözkonusu klasöre ulaşmaya çalışıyorsan büyük ihtimalle aktif kullanıcının o klasöre ulaşma yetkis yoktur.
Bununla uğraşma ulaşabildiğin bir yerdeki dosya ile çalış.” dedi ama ne kastettiğini anlayamadım. Kodun son halini şöyle bırakıyorum.
import datetime
import shutil, os
import os.path
from os import path
def vericek(year, mounth, day):
date = datetime.datetime(year, mounth, day)
if date.weekday()>4:
return
data = open("data.csv", "r")
if data.read() == "":
os.remove("data.txt")
else:
urllib.request.urlretrieve("https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2", "C:\\Users\\kartalgözü\\.spyder-py3\\data")
url='https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2'
request = urllib.request.Request(url.format(ddate))
response = urllib.request.urlopen(request)
orgsource=response.read().decode('utf-8')
source=orgsource.replace('<table border="1" cellpadding="1" class="tableClass"><tr><th>','')
source=source.replace('</th></tr><tr><td>','\\n')
source=source.replace('</th><th>',';')
source=source.replace('</span></td></tr><tr><td>','\\n')
source=source.replace('<span style="font-size:10px; color:#666"> TL',';')
source=source.replace('</span></td><td>',';')
source=source.replace('</td><td>',';')
source=source.replace(',','.')
source=source.replace('</span></td></tr></table>','')
with open('C:\\Users\\kartalgözü\\.spyder-py3\\data.csv\\'+ddate+'data.csv','w') as f:
f.write(source)
f.close(data)
for y in range(2017, 2023):
for m in range(1,13):
for d in range(1,32):
ddate = str(y)+'.'+str(m)+'.'+str(d)
vericek(y, m, d)```
Bu, hiyerarsik bir dosya sistemi uzerinde bir yol. 5 parcadan olusuyor:
C:
drive’iUsers
directory’sikartalgözü.spyder-py3
directory’sidata
directory’sidata.csv
ismi
Bu yolla ilgili bir takim isler yapabiliyorsun. Yaptigin her isin bir takim gereksinimleri var.
Mesela “dosya okuma” islemi yapmak istiyorsan, ilk 4 parcanin var olmasi, dizin olmasi ve icine bakma izninin olmasi gerekiyor. 5. parcanin var olmasi, dosya olmasi ve okuma izninin olmasi gerekiyor.
Yazma islemi yapmak istiyorsan, ilk 4 parcanin var olmasi, dizin olmasi ve icine bakma izninin olmasi ile beraber: a) 5. parcanin olmamasi ve 4. parcaya yazma/dosya yaratma izninin olmasi veya b) 5. parcanin var olmasi, dosya olmasi ve yazma izninin olmasi gerekiyor.
Odev:
with open('C:\\Users\\kartalgözü\\.spyder-py3\\data.csv\\'+ddate+'data.csv','w') as f:
Buradaki yol nedir, hangi parcalardan olusur ve yukaridaki paragraflari goze alarak, hangi izinleri ister?
Burada da aynı şekilde hiyerarşik bir yol olduğunu düşündüm ama slashlerin çift olması beni tekrar düşündürdü ve sanırım başka bir yol oldu.
Yazma işlemi yapmak istiyorum. Öyleyse;
C:
drive’ı
Users
directory’si
Kartalgözü.spyder-py3
directory’si
data
directory’si
data.csv
ismi olması gerek
O kod ile aldığınız hata tam olarak nedir? “Traceback” diye başlayan kısımdan itibaren hata mesajını paylaşabilir misiniz?
Teşekkür ederim.
Tabi, şöyle bırakıyorum:
File "C:\Users\kartalgözü\.spyder-py3\untitled2.py", line 50, in <module>
vericek(y, m, d)
File "C:\Users\kartalgözü\.spyder-py3\untitled2.py", line 23, in vericek
urllib.request.urlretrieve("https://tarim.ibb.istanbul/inc/halfiyatlari/gunluk_fiyatlar.asp?tarih={}&kategori=5&tUsr=M3yV353bZe&tPas=LA74sBcXERpdBaz&tVal=881f3dc3-7d08-40db-b45a-1275c0245685&HalTurId=2", "C:\\Users\\kartalgözü\\.spyder-py3\\data")
File "C:\Program Files\Anaconda3\lib\urllib\request.py", line 257, in urlretrieve
tfp = open(filename, 'wb')
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\kartalgözü\\.spyder-py3\\data```
Gittim o data.csv nin özelliklerinden salt okunuru kaldırdım. Dosya üzerindeki yazma, silme, açma vs gibi bütün izinleri açtım. Her yerden her izni açtım. Daha ne yapmalıyım bilmiyorum. Tek düşündüğüm şey artık 7. kattan aşşağı her şeyi fırlatmak.
Hatayı bu satırda alıyorsunuz:
İkinci argümanın bir dosya ismi olması gerekir, siz klasör ismi veriyorsunuz. Retrieve ettiği şeyleri o dosyaya yazmaya çalışacak; ama klasör pasladığınızdan hata veriyor.
Sebebinden burada bahsediliyor.
Ama zaten siz bu satırın işleviyle ilgilenmiyorsunuz kodda; sonrasında urllib.request.Request
yollayıp, source’u elde ediyor ve bir CSV dosyasına f.write(source)
ile yazmaya çalışıyorsunuz. Dolayısıyla bu satırı neden orada tuttuğunuzu bilmemekle birlikte satırı tümüyle silebilirsiniz gibi duruyor.
Bu hatadan bağımsız olarak, şurada düzeltilmesi gereken 2 şey var gibi duruyor.
İlki açmaya çalıştığınız dosyanın ismi. İkincisi de f.close(data)
satırı. Bu kısmı orijinal kodunuza döndürebilirsiniz:
Böylelikle hep aynı dosya ismi olmamış olur, ve f.close(data)
için: with
sayesinde zaten dosya handle’ı kapanacaktır ve f.close
bir argüman almaz (yani f.close()
olmalı; ama with
var ona da gerek kalmıyor).