même à la fin? pas une ligne vide ? le fichier se finit sur la ligne 22 ?
sinon hop une petite mise à jour pour ne pas traiter les lignes vides
out=""
with open('/home/bobi/Desktop/cards.txt') as f:
for ligne in f:
ligne=ligne.strip()
if ligne !='':
n,mot=ligne.split(maxsplit=1)
out+=(mot+'\n')*int(n)
with open('/home/bobi/Desktop/cards1.txt','w') as f:
f.write(out)
Edit: sinon pas de souci avec le from. le fichier à traiter est lu comme un fichier texte
maintenant le soucis et autre, il créé bien le fichier mais comme il porte le même nom, il m'en fait que un au final!!!
genre, gnome.png au lieu de me créer gnome.png , gnome(copie).png, gnome (copie1).png comme fait linux ou windows
comment lui dire car je trouve aucun tutorial sur le net
for card_obj in cards:
name = card_obj["name"].replace("//", "&") # should work on macOS & windows now
name = name.replace(":", "") # case for Circle of Protection: X
- Edité par beaudottesevran 15 octobre 2021 à 16:15:56
Je t'avais prévenu que tu écrasais le fichier d'origine, mais tu peux en créer un autre comme j'ai fait dans mon code en nommant le 2nd cards1.txt ligne 9 par exemple.
pourquoi vouloir dupliquer une image sur le disque dur ? Si tu nous disais le but final plutôt ? c'est quoi le but de ton bout de code ?
sur tous les sites, il est possible de créer son deck "comme une wishlist", il y a donc souvent des cartes en double voir en quadruple (on a pas droit dans avoir + de 4 du même exemplaire)
j'ai donc un script qui va lire mon fichier txt, et qui va chercher les images des cartes en high quality, enlever le copyright pour pouvoir les imprimers soit sur un site dédié makeplayingcards ou soit en imprimerie.
donc j'ai besoin que la carte qui est marqué 3fois dans ma liste, soit imprimé 3fois aussi et non 1fois
non c'est pas illegal de supprimer le copyright, c'est fait justement pour les cartes "dite proxy" on peut les jouer mais pas dans les tournois et pour les vendres, on voit facilement que c'est des fausses
on fait ça en générale pour pas payer 10000euros ses cartes
bien si ça sert car on a droit d'avoir plusieurs fois la même carte.
quand tu imprimes 500 cartes, crois moi cela te fait gagner du temps quand ton deck est en ordre avec le nombre de cartes qu'il faut!!!
du coup, il y a toujours un problème de ligne.replace() , il faut qu'il enlève les SB: et aussi Sideboard: mais si il y en a pas, il faut qu'il continu sa route "ce qu'il ne fait pas"
ahhh c'est deja un script mais je l'améliore!!
le voici
import scrython
import imageio
import requests
import time
import config
import numpy as np
import os
import os.path
from numpy.fft import fft2, ifft2, fftshift, ifftshift
from skimage.transform import resize
magic = ''' .$$ /$$ /$$ /$$$$$$$
| $$$ /$$$ |__/ | $$__ $$
| $$$$ /$$$$ /$$$$$$ /$$$$$$ /$$ /$$$$$$$ | $$ \ $$ /$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$
| $$ $$/$$ $$ |____ $$ /$$__ $$| $$ /$$_____/ | $$$$$$$//$$__ $$ /$$__ $$| $$ /$$/| $$ | $$
| $$ $$$| $$ /$$$$$$$| $$ \ $$| $$| $$ | $$____/| $$ \__/| $$ \ $$ \ $$$$/ | $$ | $$
| $$\ $ | $$ /$$__ $$| $$ | $$| $$| $$ | $$ | $$ | $$ | $$ >$$ $$ | $$ | $$
| $$ \/ | $$| $$$$$$$| $$$$$$$| $$| $$$$$$$ | $$ | $$ | $$$$$$/ /$$/\ $$| $$$$$$$
|__/ |__/ \_______/ \____ $$|__/ \_______/ |__/ |__/ \______/ |__/ \__/ \____ $$
/$$ \ $$ /$$ | $$
| $$$$$$/ | $$$$$$/
\______/ \______/
.$$$$$:$$$:$$$$$$$ _..._ .$$$SSSSSS$$$$$$$$$.
.$$$$$:$$$$:$$$$$$$ ~.sggg. " .~(g )$$$$$$$$$$.
$$$$$:$$$$$:$$$$$$$ .sS$$$$$$$$s. : '"--"' `$$$$$$$$$$.
`$$$:$$$$$$:$$$$$$$.$$" .. g"-. `. `.-.._ `$$$$$$$$$$
$$$:$$$$$$:$$$$$$$`$' ' `._.' : `--- $$$$$$$$$.
$$$:.$$$$$:$$$$$$$ `---' _.' $$$$$$$$$$$.
$$$$$:$$$$:$$$$$$s ----" . $$$$$$$$$$$$.
$$$$$`.$$$:$$$$$$$. `-._ .$$$$$$$$$$$$$$Sss.
$$$$$$`;$$:$$$$$$$$. _.: .' ; $$$$$$$$$$$$$$$$$$$.
.s$$$$$$'$$`.$$$$$$$$. .' `. ' _ .`. $$$$$$$$$$$$$$$$$$$$Ss.
.s$$$$$$$$$$$$:$$$$$$$$$ : _ ~~-...'.'.' : $$$$$$$$$$$$$$$$$$$$$$$
.s$$$$$$$$$$$$$$`.$$$$$$$$s : .~-,-.-.~:'.' : $$$$$$$$$$$$$$$$$$$$$$
.s$$$$$$$$$$$$$$$$$`$$$$$$$$$$. ` ~-.`"""'.' `.$$$$$$$$$$$$$$$$$$$' '''
print(magic)
print ("je vais creer le repertoire de votre deck:")
answer1=input('')
print ("quel est le nom du fichier txt:")
answer2=input('')
folder = answer1
os.chdir(".")
print("current dir is: %s" % (os.getcwd()))
if os.path.isdir(folder):
print("Exists")
else:
print("Doesn't exists")
os.mkdir(folder)
def process_card(cardname, expansion=None):
time.sleep(0.05)
# try/except in case the search doesn't return anything
try:
# If the card specifies which set to retrieve the scan from, do that
if expansion:
# Set specified from set formatter
query = "!\"" + cardname + "\" set=" + expansion
print("Processing: " + cardname + ", set: " + expansion)
else:
query = "!\"" + cardname + "\""
print("Processing: " + cardname)
card = scrython.cards.Search(q=query).data()[0]
except scrython.foundation.ScryfallError:
print("Couldn't find card: " + cardname)
return
# Handle cards with multiple faces
if card["layout"] == "transform":
cards = [x for x in card["card_faces"]]
else:
cards = [card, ]
for card_obj in cards:
name = card_obj["name"].replace("//", "&") # should work on macOS & windows now
name = name.replace(":", "") # case for Circle of Protection: X
# Process with waifu2x
r = requests.post(
"https://api.deepai.org/api/waifu2x",
data={
'image': card_obj["image_uris"]["large"],
},
headers={'api-key': config.TOKEN}
)
output_url = r.json()['output_url']
im = imageio.imread(output_url)
# Read in filter image
filterimage = np.copy(imageio.imread("/home/bobi/Desktop/mpc-scryfall-master/filterimagenew.png"))
# Resize filter to shape of input image
filterimage = resize(filterimage, [im.shape[0], im.shape[1]], anti_aliasing=True, mode="edge")
# Initialise arrays
im_filtered = np.zeros(im.shape, dtype=np.complex_)
im_recon = np.zeros(im.shape, dtype=np.float_)
# Apply filter to each RGB channel individually
for i in range(0, 3):
im_filtered[:, :, i] = np.multiply(fftshift(fft2(im[:, :, i])), filterimage)
im_recon[:, :, i] = ifft2(ifftshift(im_filtered[:, :, i])).real
# Scale between 0 and 255 for uint8
minval = np.min(im_recon)
maxval = np.max(im_recon)
im_recon_sc = (255 * ((im_recon - minval) / (maxval - minval))).astype(np.uint8)
# TODO: pre-m15, post-8ed cards
# TODO: pre-8ed cards (?)
# Borderify image
pad = 57 # Pad image by 1/8th of inch on each edge
bordertol = 16 # Overfill onto existing border by 16px to remove white corners
im_padded = np.zeros([im.shape[0] + 2 * pad, im.shape[1] + 2 * pad, 3])
# Get border colour from left side of image
bordercolour = np.median(im_recon_sc[200:(im_recon_sc.shape[0] - 200), 0:bordertol], axis=(0, 1))
# Pad image
for i in range(0, 3):
im_padded[pad:im.shape[0] + pad, pad:im.shape[1] + pad, i] = im_recon_sc[:, :, i]
# Overfill onto existing border to remove white corners
# Left
im_padded[0:im_padded.shape[0],
0:pad + bordertol, :] = bordercolour
# Right
im_padded[0:im_padded.shape[0],
im_padded.shape[1] - (pad + bordertol):im_padded.shape[1], :] = bordercolour
# Top
im_padded[0:pad + bordertol,
0:im_padded.shape[1], :] = bordercolour
# Bottom
im_padded[im_padded.shape[0] - (pad + bordertol):im_padded.shape[0],
0:im_padded.shape[1], :] = bordercolour
# Remove copyright line
if card["frame"] == "2015":
# Modern frame
leftPix = 735
rightPix = 1140
topPix = 1550
bottomPix = 1585
# creatures have a shifted legal line
try:
power = card_obj["power"]
toughness = card_obj["toughness"]
topPix = 1575
bottomPix = 1615
# Creature card
except KeyError:
pass
# planeswalkers have a shifted legal line too
try:
loyalty = card_obj["loyalty"]
topPix = 1575
bottomPix = 1615
except KeyError:
pass
im_padded[topPix:bottomPix, leftPix:rightPix, :] = bordercolour
elif card["frame"] == "2003":
# 8ED frame
try:
loyalty = card_obj["loyalty"]
leftPix = 300
rightPix = 960
topPix = 1570
bottomPix = 1600
im_padded[topPix:bottomPix, leftPix:rightPix, :] = bordercolour
except KeyError:
# TODO: Content aware fill?
pass
# Remove holostamp
if card["frame"] == "2015" and (card["rarity"] == "rare" or card["rarity"] == "mythic") \
and "/large/front/" in card_obj["image_uris"]["large"]:
# Need to remove holostamp
# Define bounds of ellipse to fill with border colour
leftE = 575
rightE = 690
topE = 1520
bottomE = 1575
cx = (leftE + rightE) / 2
cy = (topE + bottomE) / 2
h = (bottomE - topE) / 2
w = (rightE - leftE) / 2
for x in range(leftE, rightE + 1):
for y in range(topE, bottomE + 1):
# determine if point is in the holostamp area
if pow(x - cx, 2) / pow(w, 2) + pow(y - cy, 2) / pow(h, 2) <= 1:
# point is inside ellipse
im_padded[y, x, :] = bordercolour
# Write image to disk
imageio.imwrite(answer1 + "/" + name + ".png", im_padded.astype(np.uint8))
out=""
with open('answer1 + answer2 + ".txt"') as f:
for ligne in f:
ligne=ligne.strip()
if ligne !='':
n,mot=ligne.split(maxsplit=1)
out+=(mot+'\n')*int(n)
with open('answer1 + answer2 + ".txt"','w') as f:
f.write(out)
if __name__ == "__main__":
# Loop through each card in cards.txt and scan em all
with open('answer1 + answer2 + ".txt"', 'r') as fp:
for cardname in fp:
cardname = cardname.rstrip()
try:
pipe_idx = cardname.index("|")
process_card(cardname[0:pipe_idx], cardname[pipe_idx+1:])
except ValueError:
process_card(cardname)
donc j'ai créé le ascii art ^^, et j'ai codé les questions et les reponses, et j'ai réussi qu'il upload les images dans le dossier créé, mais je n'arrive pas qu'il va chercher les informations des cartes dans le fichier txt indiqué...
- Edité par beaudottesevran 15 octobre 2021 à 18:07:24
du coup, en ligne 6 de mon code, rajouter les replace qui vont bien ligne.replace("SB: ","").replace("Sideboard: ","").split(maxsplit=1) et ça devrait aller si pas de nouvelles surprises
et tout ton code qui n'est pas une fonction devrait être dans if __name__="__main__"
mais encore une fois, tu n'as besoin de sauvegarder qu'une fois l'image d'une créature, et dire ensuite que tu la veux en n exemplaires; mais si tu insistes pour l'avoir n fois, il faut que si l'image existe, rajouter un numéro derrière (par exemple) au moment de son enregistrement (ligne 214)
@umfred: N'aies pas peur, je vais t'envoyer tes candies d'Alloween par MP ... Pourquoi ne pas utiliser startswith et faire 3 (ou plus) traitements différents? if ligne.startswith(...): # faire l'action appropriée.
Le Tout est souvent plus grand que la somme de ses parties.
oui mais je sais pas comment faire avec ton code...
j'ai remodifié mon code, j'avance, j'arrive maintenant à choisir le dossier de download des images et choisir le fichier txt
mais je voudrais comme tu as dis, qu'il duplique le fichier txt et j'ai du mal car j'ai fait des path au lieu d'écrire en dur les liens
out=""
with open(filePath2) as f:
for ligne in f:
ligne=ligne.strip()
if ligne !='':
n,mot=ligne.replace('SB:','').replace('Sideboard:','').split(maxsplit=1)
out+=(mot+'\n')*int(n)
with open(filePath2 + 2 ,'w') as f:
f.write(out)
if __name__ == "__main__":
# Loop through each card in cards.txt and scan em all
with open(filePath2 + 2 , 'r') as fp:
for cardname in fp:
cardname = cardname.rstrip()
try:
pipe_idx = cardname.index("|")
process_card(cardname[0:pipe_idx], cardname[pipe_idx+1:])
except ValueError:
process_card(cardname)
et ça bug toujours avec le nom "Sideboard:", si j'enleve de mon fichier txt, ca marche bien mais si je laisse ca fait un message d'erreur
merci beaucoup de vos aides
- Edité par beaudottesevran 15 octobre 2021 à 21:40:19
C'est dans quel but ? Passer d'un fichier texte (pas le meilleur support de stockage) "compressé", c'est-à-dire, les lignes factorisées à un fichier texte avec les quantités de cartes développées et donc répétées ?
Rien que sur l'exemple de 22 lignes je crois, on passerait à 60 lignes.
C'est pour un jeu, et mieux vaudrait rester basique. Ou mieux, utiliser un vrai système de stockage comme pickle ou mieux du sql.
mon script est deja prêt est fonctionnel, sauf que je veux qu'il fonctionne avec SB: et Sideboard: en les retirants mais ca ne marche pas, dès qu'il y a une de ses expressions le script bug, si j'enlève cela marche nickel
et je veux juste que quand il fait une image et qu'il trouve le même nom, il fait la copie de l'image
ca permet tout simplement d'imprimer des decks (boite de 60 cartes) sans retoucher pendant des heures sur photoshop et adapter à la bonne taille les cartes et les recherchers sur le net
ici, le script le fait tout seul juste avec un fichier txt!
il faut cliquer sur appr, vous mettez juste le fichier dans le repertoire du script et il va chercher toute les cartes du deck, enlever le copyright, adapter pour imprimer!
excuse mais, on peut m'aider ou pas? ça fait mille fois que je dis que oui, wizard tolère les proxy "fake card" parceque c'est visible et qu'ils ont un procèder bien à eux (un imprimeur classique ne peut pas le faire)
bon je viens enfin de comprendre la source du problème de la fonction ligne.replace('Sideboard:','')
cela fonctionne très bien mais comme ceci
Sideboard: 2 loup-garou
si il y a juste écrit
Sideboard:
sans rien derrière le programme bug
peut être en mettant un \n derriere?
- Edité par beaudottesevran 16 octobre 2021 à 10:41:46
oui, je viens de comprendre, effectivement ça marche mais quand il y a 2 fonction replace, cela ne veut pas marcher.
out=""
with open(filePath2) as f:
for ligne in f:
ligne=ligne.strip()
ligne=ligne.replace('Sideboard:', '')
if ligne !='':
n,mot=ligne.replace('SB:','').replace('//','').split(maxsplit=1)
out+=(mot+'\n')*int(n)
SB: et Sideboard: fonctionne très bien mais le replace '//' ne fonctionne absolument pas, peut etre parceque je n'ai pas de n "number" sur la ligne avec //
j'ai juste // magic pour les nuls
donc du coup, j'ai fait ainsi
out=""
with open(filePath2) as f:
for ligne in f:
ligne=ligne.strip()
ligne=ligne.replace('Sideboard:', '')
if ligne !='':
mot=ligne.replace('//','')
n,mot=ligne.replace('SB:','').split(maxsplit=1)
out+=(mot+'\n')*int(n)
ça veut dire quoi "ça ne marche pas" ???? c'est vague, message d'erreur, pas le bon résultat? (affiche ligne avant et après et n et mot après), on ne peut pas deviner ce qui ne marche pas.
Et je répète mon message précédent, le replace avant le test (quand je dis 'le', j'aurais dû dire 'les' en fait)
ligne 6 => ligne=ligne.replace('Sideboard: ','').replace('SB: ','').replace('//','') (à noter l'espace en fin de sous-chaine 'SB: ' et 'Sideboard: ' pour remplacer aussi l'espace qui suit la sous-chaine.
ligne 9 => n,mot=ligne.split(maxplsit=1) (en supprimant la ligne 8)
ta succession ligne 8, ligne 9 ne sert à rien: tu remplaces met dans mot la chaine ligne dans laquelle est supprimé le '//' et en ligne 6 tu récupères les infos dans n et mot en te basant sur la chaine ligne
le truc c'est qu'on découvre à chaque fois des cas, sans exemples ni explications, donc difficile de te donner la réponse qui te convient (on ne sait pas d'où sortent ces // et comment tu utilises les lignes qui les contiennent, etc etc)
En relisant, je crois comprendre qu'il faut ignorer cette ligne qui commence par // ? dans ce cas, il faut rajouter ce cas dans la condition =>
if ligne!='' and not ligne.startswith("//"):
et bien sûr supprimer la partie replace("//",'') (juste ce replace)
ça fonctionne! voici le code final pour ceux qui veulent faire pareil!
out=""
with open(filePath2) as f:
for ligne in f:
ligne=ligne.strip()
ligne=ligne.replace('Sideboard:', '')
if ligne !='' and not ligne.startswith("//"):
n,mot=ligne.replace('SB:','').split(maxsplit=1)
out+=(mot+'\n')*int(n)
with open(filePath3,'w') as f:
f.write(out)
et j'ai une dernière question après j'aurai enfin finit mon script, je voudrais que une fois qu'il est fini de mettre toute les images dans le dossier, je veux qu'il créé un fichier pdf de toutes les images, ou chaque page à 9 images (pour imprimer)
voici ma fonction qui créé les images imageio
full_path = os.path.join(filePath1, name + ".png")
if os.path.exists(full_path):
number = 1
while True:
full_path = os.path.join(filePath1, name + str(number) + ".png")
if not os.path.exists(full_path):
break
number += 1
imageio.imwrite(full_path, im_padded.astype(np.uint8))
img_io = imageio.imread(full_path)
# Resize image
img_io = resize(img_io, (1042, 744))
# Write ICO image
imageio.imwrite(full_path, img_io)
os.chmod(full_path, 0o777)
j'ai vu ce script mais impossible d'appeler la fonction "j'ai fait import nom_du_script"
tu as téléchargé le fichier python du git ? tu l'as mis où par rapport à ton script ? si dans le même dossier, un "import unite_pictures_into_pdf" et l'appeler via unite_pictures_into_pdf.unite_pictures_into_pdf()
et installer le module reportlab utilisé par le code de la fonction
c'est bon, j'ai trouvé un code qui marche très bien mais y'a un problème, je veux 3 images par ligne et donc 9 images par page, j'ai beau lui dire, il me met 4 images par lignes, ce qui fait que la 4eme est coupé...
avez vous une idée?
class MyFPDF(FPDF):
pass
def photos_pdf():
pdf = MyFPDF("P", format='A4', unit='mm')
photos = glob.glob(filePath1 + "/*")
x = 5 # marge gauche
y = 5 # marge haute
counter = 0
nbre = 3 # NOMBRE DE VIGNETTES PAR LIGNES
nbre_par_page = 9
counter2 = 0
pdf.add_page()
for photo in photos:
if counter2 != nbre_par_page:
if counter != (nbre):
pdf.image(photo, x=x, y=y, w=63, h=88)
x += 68
counter += 1
counter2 += 0
else:
pdf.image(photo, x=x, y=y, w=63, h=88)
counter = 0
x = 5
y += 90
else:
pdf.add_page()
counter = 0
counter2 = 0
x = 5
y = 5
pdf.output(path2 + "/A4_cards.pdf", 'F')
os.chmod(path2 + "/A4_cards.pdf", 0o777)
photos_pdf()
- Edité par beaudottesevran 23 octobre 2021 à 14:46:53
ton counter2 n'est jamais incrémenter (tu lui ajoutes juste 0 en ligne 21) et il devrait être incrémenter dans tes 2 parties du if counter !=nbre (ou une fois après ce bloc if; ce qui fait en plus que tu n'ajoutes jamais de pages (ligne 28)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.